1

@OneToOne我在父实体和子实体之间有双向关系。

在父母身上,我有这个(是的,孩子是关系的拥有者):

@OneToOne(mappedBy = "parent", fetch = FetchType.EAGER, optional = true, cascade = { CascadeType.ALL })
private Child child;

他的主键(很遗憾)是由数据库生成的:

@Column(name = "id", updatable = false)
@GeneratedValue(GenerationType.IDENTITY)
@Id
private long id;

在孩子身上,我有这个:

// note: insertable = false, updatable = false
@JoinColumn(name = "parentId", referencedColumnName = "id", insertable = false, updatable = false)
@OneToOne(optional = false, fetch = FetchType.EAGER, cascade = { CascadeType.REFRESH })
private Parent parent;

@Column(name = "parentId", updatable = false)
@Id
private long parentId;

通常我会使用@PrimaryKeyJoinColumn注释而不是这两个映射,但是一些 JPA 提供程序在这方面存在错误。

在某个时候,我在一个新的父实例上做了一些工作。作为这项工作的一部分,我这样做:

this.child = new Child(this);

...在Child(Parent)构造函数中我这样做:

this.parent = parent; // now the bidirectionality is complete
if (parent != null) {
  this.parentId = parent.getId(); // suspect; will be 0L
}

因此,到目前为止,如果您和我在一起,我有一个由 aParent和 a组成的对象图,它们彼此之间Child@OneToOne关系,并且已正确初始化。这两个对象都是非托管实体。

然后我尝试对persist()父母:

this.em.persist(parent);

...我在我们的 Informix 数据库上发现外键违规。另一方面,我们的 H2 数据库处理得很好。

这是应该发生的事情吗?难道我做错了什么?

4

1 回答 1

0

我有一些问题可能会对你有所帮助。请在您的原始帖子中回答它们:

Q1:你确定你在 H2 数据库中有外键和主键约束(检查一下)吗?

Q2:NULLABLE国旗呢?(两个数据库)

Q3:在调用persist()的那一刻,调试并检查child中的parentId的ID是什么。

Q4:是否可以CascadeType.ALL从父级中删除并手动管理操作(或仅保留)?

希望回答其中一个问题会给您解决问题的方法。

于 2013-09-21T22:02:55.777 回答