【问题标题】:Java/Hibernate: How can I insert a specific value for a column with autoincrement / @GeneratedValueJava/Hibernate:如何为具有自动增量/@GeneratedValue 的列插入特定值
【发布时间】:2011-11-14 11:24:20
【问题描述】:

我有一个表,它的 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

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

【问题讨论】:

  • 这已经被问过了,并且有一个建议的解决方案here。希望这可以帮助。这篇文章链接自 thisstackoverflow questions。

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


【解决方案1】:

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

如果 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...为什么不能这样做?

【讨论】:

  • 这实际上是我在发布此内容后在测试中开始这样做的方式:-P 但我仍然很好奇如何显式设置自动增量字段的值。 MySQL 允许你这样做,如果 hibernate 具有与 MySQL 相同的行为那就太好了——如果没有提供,则使用自动值,否则使用提供的值。不要认为那会是一个错误。
猜你喜欢
  • 1970-01-01
  • 2012-05-29
  • 2016-03-19
  • 2015-10-30
  • 1970-01-01
  • 2012-01-05
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
相关资源
最近更新 更多