3

DDDを適用するのは初めてです。EclipseLinkを使用しています。私は次の問題を抱えています。私のルートエンティティには子エンティティ(child)があります。この子エンティティには子エンティティ(childSpecs)もあります。

ルートエンティティ(root)に子エンティティの作成と追加を任せたい:

root.addChild(arg1, agr2);

しかし、childなしでは存在できませんchildSpecs。の作成をchild担当しましchildSpecsた。

したがってaddChild(arg1, arg2)、オブジェクトchildを呼び出すと、childSpecs作成され、相互に関連付けられrootます。ただしchildSpecs、IDを保持する必須フィールドがありchildます。しかし、childが作成されたとき、それはまだIDを持っていません。それが永続化されるときに作成されます。(現在、JPA機能TableGeneratorを使用して代理キー値を生成しています。)これを解決するためのソリューションを誰かが知っていますか。私の考えは、独自のIDジェネレーターを構築することでした。しかし、カウントの同時実行性を取り入れると、それは少し複雑になる可能性があります。

追加情報:

@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

Embeddedidクラスとpkクラスには関係自体を含めることができないため、@mapsIdを使用して関係をマークし、Embeddedidにマップする属性を指すことができます。

于 2013-01-24T12:52:28.363 に答える
1

EmbeddedIdを使用せず、代わりに@ManyToOneの@IdをRootChildに配置し、@IdClassを使用することをお勧めします。

http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#JPA_2.0を参照してください 。

于 2013-01-24T13:56:09.847 に答える