我有一个带有自动递增的id列的表,还有一个带有用@GeneratedValue(strategy = GenerationType.AUTO)注释的getter的Java对象。这在保存时非常有效,但是对于单元测试,我希望指定ID,以便它是确定性的。在MySQL (我们正在使用的DB )中,我可以在insert语句中指定一个值,一切都可以正常工作。但是,如果我在java对象中设置id字段并尝试持久化,hibernate就会抛出一个异常。如何允许Hibernate让我为通常生成的值指定一个值?
字段示例:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return this.id;
}在MySQL中工作:
INSERT INTO myTable (id, str)
VALUES (10,'this works!')不起作用:
MyObject myObject = new MyObject();
myObject.setId(10L); //remove this line and hibernate saves ok
myObject.setStr("this does not work.");
daoForMyObject.persist(myObject); //throws org.springframework.dao.DataIntegrityViolationException提前感谢您帮助我成为一名优秀的测试驱动开发人员!
发布于 2011-09-11 03:19:11
我很抱歉以一种你可能不想要的方式回答,但我认为你的想法很糟糕。如果您的目标是成为一名优秀的测试驱动开发人员,请不要这样做。你基本上是在破坏你想要测试的东西。在被测试时,你从你的单元请求一个特殊的行为。但是单元测试应该按原样测试单元。
如果hibernate允许您为自动增量(或其他)字段设置固定值,则可以认为这是hibernate中的一个bug。在我看来,hibernate不允许这样做是件好事。
为什么不在session.save()方法调用之后读取id值呢?可能您的daoForMyObject.persist()调用了save(),所以在这之后您就可以读取id:
MyObject myObject = new MyObject();
myObject.setStr("this does work.");
daoForMyObject.persist(myObject);
Long id = myObject.getId();现在使用id来引用你的实体,而不是10...为什么你不能这样做呢?
https://stackoverflow.com/questions/7373618
复制相似问题