0

我有一个表,其 id 列自动递增,还有一个 Java 对象,其 getter 用@GeneratedValue(strategy = GenerationType.AUTO). 这在保存时效果很好,但是对于单元测试,我想指定 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

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

4

1 回答 1

4

很抱歉以您可能不想要的方式回答,但我认为您的想法很糟糕。如果您的目标是成为一名优秀的测试驱动开发人员,请不要这样做。你基本上是在破坏你想要测试的东西。您在测试时要求您的单位采取特殊行为。但是单元测试应该按原样测试单元。

如果 hibernate 允许您为 autoincrement(左右)字段设置一个固定值,这可能被认为是 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...为什么您不能这样做?

于 2011-09-10T19:19:11.037 回答