我正在为连接到数据库的应用程序的服务器部分编写 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
而不是数据库的默认值。
我可以这样做吗,如果可以,那我该怎么做,如果不能,我还能做什么?