JPA - 如何添加子实体以聚合根

时间:2013-01-24 10:10:17

标签: java jpa domain-driven-design

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

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

root.addChild(arg1, agr2);

但如果没有childchildSpecs就不能存在。我让child负责创建childSpecs

因此,在调用addChild(arg1, arg2)时,会创建对象childchildSpecs并与彼此和root相关联。但childSpecs有一个必填字段,用于保存child的ID。但是当创建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;

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

请参阅, http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#JPA_2.0