Seam / Hibernate / JPA - 重复主键异常?

时间:2011-03-28 23:59:57

标签: java hibernate jpa seam primary-key

我有一个使用Seam和JPA(Hibernate)持久化的对象模型。它看起来像这样:

@Entity(name = "MyObject")
public class MyObject {

...

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_myobj")
@SequenceGenerator(name = "seq_myobj", sequenceName = "seq_myobj")
private Long id = null;

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, optional = false)
@NotNull
   private MySubObject subObjA=null;

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, optional = false)
@NotNull
   private MySubObject subObjB=null;

...

}

@Entity(name = "MySubObject")
public class MySubObject {

...

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_mysubobj")
@SequenceGenerator(name = "seq_mysubobj", sequenceName = "seq_mysubobj")
private Long id = null;

}

我已正确定义了@ManyToOne注释以及所有内容。但是,如果我尝试持有MyObject的{​​{1}}和subObjA设置的实例,我会得到一个例外,说我有一个重复的主键,其中一个是子obj。什么会导致这种行为?两个对象的标识符类型都设置为SEQUENCE,如果我设置其中一个,我没有问题。只有当我设置两者时才会得到异常。

我正在运行Seam 2.2,我的后端数据库是PostgreSQL。有什么可能导致这种奇怪行为的想法?我认为这两个对象将作为同一事务的一部分保留,并且将自动分配正确的主键。就像我说的,如果我只设置其中一个对象就没有问题。它只发生在我同时设置它们时。你能给予的任何帮助都会非常感激。

编辑然而,我注意到在测试各种事情时有一些奇怪的行为。如果我以编程方式创建MyObject并设置其所有属性(包括subObj),它会保持没有问题。但是,如果我使用表单输入属性,我会收到错误。它可能与交易有关吗?

2 个答案:

答案 0 :(得分:0)

如果在MySubObject类中重写equals / hashCode,请确保这些方法仅检查代理键id(在这种情况下,您应该完全避免使用它们。)

如果equals / hashCode方法适用于某些业务键属性,请确保在持久化之前这些键是唯一的。

答案 1 :(得分:0)

通过一系列测试和不同的场景,并找到了有效的场合。因此,当我提交并持久保存到数据库时,我的动作类中似乎存在一个错误。