3

这是我第一次申请DDD。我使用 EclipseLink。我有以下问题。我的根实体有一个子实体 ( child)。该子实体还有一个子实体 ( childSpecs)。

我想让根实体 ( root) 负责创建和添加子实体:

root.addChild(arg1, agr2);

child不能没有childSpecs. 我child负责创建childSpecs.

因此,当调用addChild(arg1, arg2)对象时childchildSpecs被创建并且彼此相关并且root. 但是childSpecs有一个强制字段,它保留child. 但是在child创建时它还没有一个 id。这将在持久化时创建。(目前我使用 JPA 功能 TableGenerator 来生成我的代理键值。)有人知道解决这个问题的解决方案吗?我的想法是建立自己的 id-generator。但是在考虑并发时这可能有点复杂。

附加信息:

@Entity
@Table (name = "root")
public class Root implements Serializable {
    @Id
    @Basic (optional = false)
    @Column (name = "root_id")
    private Integer        rootId;

    @OneToMany (mappedBy = "root")
    private List<RootChild>   rootChildList;

-

@Entity
@Table (name = "root_child")
public class RootChild implements Serializable {
    @Id
    @Basic (optional = false)
    @Column (name = "root_child_id")
    private Integer           rootChildId;

    @JoinColumn (name = "root_id", referencedColumnName = "root_id")
    @ManyToOne
    private Root               root;

    @OneToMany (cascade = CascadeType.ALL, mappedBy = "rootChild")
    private List<RootChildSpecs> rootChildSpecsList;

-

@Entity
@Table (name = "root_child_specs")
public class RootChildSpecs implements Serializable, Mutable<RootChildSpecs> {
    @EmbeddedId
    protected RootChildSpecsPK rootChildSpecsPK;

    @JoinColumn (
        name                 = "root_child_id",
        referencedColumnName = "root_child_id",
        insertable           = false,
        updatable            = false
        )

     @ManyToOne (optional = false)
     private RootChild          rootChild;

-

@Embeddable
public class RootChildSpecsPK implements Serializable {
    @Basic (optional = false)
    @Column (name = "root_child_id")
    private int rootChildId;

    @Basic (optional = false)
    @Column (name = "d_rec")
    private int dRec;

    @Basic (optional = false)
    @Column (name = "t_rec")
    private int tRec;
4

2 回答 2

1

JPA 2.0 允许从引用派生 ID,允许您将 RootChildSpecs->RootChild 标记为 rootChildSpecs 的 ID 的一部分,并在生成时从中提取值。一个简单的例子在这里http://wiki.eclipse.org/EclipseLink/Examples/JPA/2.0/DerivedIdentifiers

您可以使用@mapsId 标记关系,以指向它在embeddedid 中映射的属性,因为Embeddedid 和pk 类本身不能包含关系。

于 2013-01-24T12:52:28.363 回答
1

我建议不要使用 EmbeddedId,而是将 @Id 放在您的 @ManyToOne 到 RootChild 并使用 @IdClass。

见, http ://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#JPA_2.0

于 2013-01-24T13:56:09.847 回答