如何将java对象的id与其关联的db行同步?

时间:2011-01-11 05:26:09

标签: java hibernate jpa

在调用entityManager.persist(object);

后,如何将java对象的id与其关联的db行同步?

并承诺交易? 如果您正在使用db设置id的任何策略,则需要从db获取该id并将其设置在object上,如果要在将来的查询中使用object。这样:

entityManager.refresh(object);

不起作用,因为它使用id来查询对象,这就是缺少的东西。 我唯一能想到的就是在其唯一属性上查询db for object,然后在对象上设置id。

也许有一个id生成的最佳实践可以解决这个我不知道的问题。

3 个答案:

答案 0 :(得分:4)

persist()使实例受管理,这意味着id在调用persist()后会出现,会在提交事务时。您可以通过执行此操作进行检查,

System.out.println(someEntity.getId()); // null at this point of time
em.persist(someEntity)
System.out.println(someEntity.getId()); // should print the id

答案 1 :(得分:1)

如果id策略是由数据库生成的id策略(如序列),那么

persist会修改持久化对象,然后id将在持久化对象中设置。

答案 2 :(得分:0)

就个人而言,我不会让数据库自动生成我的ID。相反,我使用随机的128位数字,并在我的应用程序层内创建初始对象时自己设置它们。如果我的数据库引擎支持它,我将它们存储在VARBINARY(16)或最好是BINARY(16)。

我不知道与Hibernate相关的确切答案,但是如果你想让自动生成的ID回复给你,这个链接可能会提供一些线索:

http://download.oracle.com/javase/1.4.2/docs/api/java/sql/Connection.html#prepareStatement(java.lang.String,%20int

特别注意第二个参数:

Connection.prepareStatement(String sql, int autoGeneratedKeys)

据推测,有一些方法可以让Hibernate使用Statement.RETURN_GENERATED_KEYS的值调用第二个参数!