2010-11-08 164 views
2

我使用JPA 1,休眠和Oracle 10.2.0和我的实体的定义是这样的:我可以重写生成的ID吗?

@Entity 
@Table(name="TERMS") 
public class Term implements Serializable { 
    @Id 
    @GenericGenerator(name = "generator", strategy = "guid", parameters = {}) 
    @GeneratedValue(generator = "generator") 
    @Column(name="TERM_ID") 
    private String termId; 
} 

我在实体(和子实体)的XML表示将在未来进行的情况通过网络服务来更新/替换现有的服务。我的想法是只删除旧的,并从传入的XML重新创建它。

但是,当我的实体具有现有的ID似乎让Hibernate非常生气时,坚持下去。那么这实际上是可能的还是避免删除它们并仅仅试图通过合并来实现它更好?从休眠

忾:

org.hibernate.PersistentObjectException: detached entity passed to persist: com.idbs.omics.catalog.entity.Term 

感谢

+0

我结束了分配我自己的ID,它只是起作用:) – willcodejavaforfood 2010-11-09 11:45:52

回答

2

我的想法是只删除旧的,并从传入的XML重新创建它。然而,做一个坚持当具有现有的ID我的实体似乎使休眠很生气..

事实上,你不能分配Id时,它应该产生,至少不会与Hibernate不会考虑实体,但作为detached(在这种情况下JPA规范是有点模糊的确切规则,但这就是Hibernate的行为,见5.1.4.5. Assigned identifiers更多提示)。

那么这实际上是可能的还是更好地避免删除它们,只是试图合并做到这一点?

要删除/ Web服务使用情况下插入可能的话,你必须要么:

  • 没有分配ID〜或〜
  • 使用实体的特殊版本没有生成标识〜或〜
  • 使用bulk operations(?)

的选择,如果你实际更新detached实体将确实使用merge(但为了以防万一,请看这些previousquestions)。

哪种方法更好?我不知道,它认为这取决于你的需求。如果你正在更新现有的实体,后者看起来更自然。与前者相比,你真的会得到“新”实体(包括乐观锁列的新值)。根据过程的确切实施情况,表现可能也会有所不同。顺便说一句,并发性(只是提及它,我并不真正期待答案)?

+0

我对使用合并首先是因为通过Web服务进入的'更新'实体可能会有很多内部和儿童的变化已被添加/删除。不太确定如何才能奏效。要保持身份证是一个要求,所以不能做任何事情。我不会回答你关于并发性:) – willcodejavaforfood 2010-11-09 09:49:21

+0

合并不会持续新的实体,即使是级联=合并,坚持? – willcodejavaforfood 2010-11-09 09:56:26

+0

@willcodejavaforfood:我认为一些测试是值得欢迎的。关于第二个评论,是的,merge会持续*新的实体(我的意思是,真的*新*,现在不太清楚'Id'相关的东西)。 – 2010-11-09 10:38:25

相关问题