所以,我有一个包含三个实体的模型:Document、Template和Origin。
我的问题的主要来源是我需要Document的编号对于Template的Source是唯一的,但是由于原点是Template
(而不是Document
)的属性,因此我无法直接为其创建唯一约束——前进的方式。
澄清一下,代码中的模型如下所示:
起源:
@Entity
public class Origin {
@Id private Long id;
// ... some other fields
}
模板:
@Entity
public class Template {
@Id private Long id;
@Column private Origin origin;
// ... some other fields
}
文档:
@Entity
public class Document {
@Id private Long id;
@Column Template template;
@Column Long number;
// ... some other fields
}
因此,Origins 有多个关联的模板,您可以使用模板为 Origin 创建文档。
正如我所说,我的问题的根源是每个来源的文档编号必须是唯一的。我能想到的唯一方法是使用originId的附加字段,并尝试保持更新。
所以,我试图做这样的事情:
@Entity
@Table("documents",
uniqueConstraints = @UniqueConstraint(columnNames = {"number", "originId"}))
public class Document {
@Id private Long id;
@Column Template template;
@Column Long number;
// ... some other fields
// added extra field to use in the constraint:
@Column Long originId;
@PrePersist
@PreUpdate
private void updateConstraintValue() {
this.originId = getTemplate().getId();
}
}
注意:为简洁起见,省略了 getter、setter 和其他样板
但这并不总是适用于 JPA,因为 Template 对象在持久/更新事件时不需要是托管实体(只需要设置一个 id 才能使关系工作)。
然后我现在认为这可能不是最好的方法。所以,我的问题是:
- 我还有什么其他选择?JPA(或 Hibernate)API 是否有更好的方法来处理这个问题?(我正在使用 JPA 2 和 Hibernate 3.6.10,顺便说一句)
- 我是否应该只信任客户端代码将 Template 对象与具有正确 id 的 Origin 对象一起传递(即使它可能与数据库中的不同)?
- 我会更好地在 Document 中映射 Origin 本身,并信任客户端代码以使其与模板保持同步吗?