首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java/Hibernate:如何使用autoincrement / @GeneratedValue为列插入特定值

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

Stack Overflow用户
提问于 2011-09-11 02:08:29
回答 1查看 5.5K关注 0票数 0

我有一个带有自动递增的id列的表,还有一个带有用@GeneratedValue(strategy = GenerationType.AUTO)注释的getter的Java对象。这在保存时非常有效,但是对于单元测试,我希望指定ID,以便它是确定性的。在MySQL (我们正在使用的DB )中,我可以在insert语句中指定一个值,一切都可以正常工作。但是,如果我在java对象中设置id字段并尝试持久化,hibernate就会抛出一个异常。如何允许Hibernate让我为通常生成的值指定一个值?

字段示例:

代码语言:javascript
复制
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
    return this.id;
}

在MySQL中工作:

代码语言:javascript
复制
INSERT INTO myTable (id, str)
VALUES (10,'this works!')

不起作用:

代码语言:javascript
复制
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

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

EN

回答 1

Stack Overflow用户

发布于 2011-09-11 03:19:11

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

如果hibernate允许您为自动增量(或其他)字段设置固定值,则可以认为这是hibernate中的一个bug。在我看来,hibernate不允许这样做是件好事。

为什么不在session.save()方法调用之后读取id值呢?可能您的daoForMyObject.persist()调用了save(),所以在这之后您就可以读取id:

代码语言:javascript
复制
MyObject myObject = new MyObject();
myObject.setStr("this does work.");
daoForMyObject.persist(myObject);
Long id = myObject.getId();

现在使用id来引用你的实体,而不是10...为什么你不能这样做呢?

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7373618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档