【发布时间】:2011-03-28 23:59:56
【问题描述】:
我有一个使用 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 的实例,其中设置了subObjA 和subObjB,我会得到一个异常,说我有一个重复的主键,其中一个子obj。什么会导致这种行为?两个对象的标识符类型都设置为 SEQUENCE,如果我设置一个或另一个我没有问题。只有当我同时设置两者时,我才会得到异常。
我正在运行 Seam 2.2,我的后端数据库是 PostgreSQL。关于可能导致这种奇怪行为的任何想法?我认为这两个对象将作为同一事务的一部分保留,并且将自动分配正确的主键。就像我说的,如果我只设置其中一个对象没有问题。只有当我同时设置它们时才会发生这种情况。非常感谢您提供的任何帮助。
编辑 但是,我在测试各种事物时注意到了一些奇怪的行为。如果我以编程方式创建 MyObject 并设置其所有属性(包括 subObj),它仍然没有问题。但是,如果我使用表单输入属性,则会收到错误消息。会不会跟交易有关?
【问题讨论】:
-
您能向我们展示您应用的所有 JPA 注释吗?
-
请告诉我们您是否在 MySubObject 类中覆盖 equals/hashCode。
-
已编辑以在 subObjA/B 属性上包含注释
-
是的,我在 MySubObject 上实现了 equals/hashCode
-
@Shadowman 您能否展示您的表单的简化版本以及如何保存 myObject 及其 mySubObject 属性?只是一个建议:未初始化的字段是隐含的 null,所以你不需要写 private MySubObject subObjA = null; 只需 private MySubObject subObjA; 就足够了。
标签: java hibernate jpa seam primary-key