我可以在@GeneratedValue中为持久性单元更改GenerationType的默认值(AUTO)吗?

时间:2012-10-25 06:23:35

标签: java hibernate jpa

我正在为连接到数据库的应用程序的服务器部分编写junit测试。我们通常的策略是放入src/test/resources/新的META-INF/persistence.xml文件,该文件覆盖默认值,以便测试不会连接到Oracle数据库,而是连接到hsqldb。

这是我的问题 - 其中一个实体的字段定义如下:

@Id
@Column(name = "ID", nullable = false)
@SequenceGenerator(name="sequence", sequenceName="sequence")
@GeneratedValue(generator="sequence")
protected Integer id;

在应用程序的标准运行期间,它运行正常 - 我没有为@GeneratedValue定义特定策略,因此它默认为GenerationType.AUTO,根据http://docs.oracle.com/javaee/5/api/javax/persistence/GenerationType.html#AUTO,允许持久性提供程序决定采用哪种策略使用取决于下面的数据库,因为通常它是Oracle和Oracle的默认生成器策略是GenerationType.SEQUENCE

但是当我进行测试时,我得到了:

[junit] Testcase: xxx.TestCase took 0 sec
[junit]     Caused an ERROR
[junit] "xxx.Entity.id" declares generator name "sequence", but uses the AUTO generation type.  The only valid generator names under AUTO are "uuid-hex" and "uuid-string".

根据Hibernate @generatedvalue for HSQLDB中的评论,hsqldb的默认策略为GenerationType.IDENTITY

显而易见的解决方案是将strategy=GenerationType.SEQUENCE添加到实体的字段定义中,但1)通常不好的做法是更改工作代码以适应测试用例2)我没有完全访问权限或权限来更改此实体。因此,假设我无法改变,我的下一个预感是在我们的测试META-INF/persistence.xml中将一些属性置于persistece-unit定义中,这将告诉Hibernate默认生成器策略为SEQUENCE而不是数据库的默认值。 / p>

我可以这样做,如果是,那我怎么能这样做,如果没有那么我还能做什么?

2 个答案:

答案 0 :(得分:1)

不,您无法更改整个持久性单元的默认值,但您可以在XML映射中覆盖策略:

@Entity
public class EntityA {
    @Id
    @GeneratedValue
    protected Integer id;
    ...
}
META-INF中的

orm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd" version="2.0">
    <package>somepackage.somewhere</package>
    <entity class="EntityA" metadata-complete="false" access="FIELD">
        <attributes>
            <id name="id">
                <generated-value strategy="SEQUENCE"/>
             </id>
        </attributes>
    </entity>
</entity-mappings>

在上面的示例 metadata-complete =“false”表示那些未被覆盖的注释仍然适用。文件被粘贴为完整,因为人们常常难以从多个来源进行复制粘贴。

有关覆盖映射的详细信息,例如可以从Hibernate documentation找到。

答案 1 :(得分:0)

确保在数据库中执行SEQUENCE

示例:

CREATE SEQUENCE example_sq START WITH 50 INCREMENT BY 50;   

使用strategy=GenerationType.SEQUENCEHere更多参考。

@Id
@SequenceGenerator(name = "sequence", sequenceName = "sequence", allocationSize=50)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sequence")
protected Integer id;
相关问题