我有一个带有自动增量的id列的表,以及一个带有@GeneratedValue(strategy = GenerationType.AUTO)
注释的getter的Java对象。这在保存时效果很好,但是对于单元测试,我想指定ID以使其具有确定性。在MySQL(我们正在使用的数据库)中,我可以在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
提前感谢您帮助我成为一名优秀的测试驱动开发人员!
答案 0 :(得分:4)
我很抱歉以你可能不想要的方式回答,但我认为你的想法很糟糕。如果您的目标是成为一名优秀的测试驱动开发人员,请不要这样做。你基本上破坏了你想要测试的东西。您在测试时要求从您的单元中获得特殊行为。但单元测试应该按原样测试单元。
如果hibernate允许你为自动增量(或左右)字段设置一个固定值,这可能被认为是hibernate中的一个错误。在我看来,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 ...为什么你不能这样做呢?