Java / Hibernate:如何使用autoincrement / @GeneratedValue为列插入特定值

时间:2011-09-10 18:08:29

标签: java hibernate unit-testing auto-increment persist

我有一个带有自动增量的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

提前感谢您帮助我成为一名优秀的测试驱动开发人员!

1 个答案:

答案 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 ...为什么你不能这样做呢?