0

コンテキストでは、クライアント側で MVP パターンを使用するため、Oneリストを含むビューは ID のみを認識し、サーバーで新しいものが受信されたときに、の外部キーをMany更新できるようにしたいOne「setOneId」またはOneID が必要な値に設定された空のオブジェクト。

そこで、DataNucleus で多対一の一方向を作成しようとしましたが、少し苦労しています。私は JDO または JPA を使用しても問題ありません。あまり気にしません。JPAで、私はこれを試しました:

@Entity
public class Many {
    @Id
    String id;

    @ManyToOne
    @Join(name = "idOne")
    One one;
}

@Entity
public class One {
    @Id
    String id;
}

それはほとんど私が欲しいものです。1 対多が作成されますが、結合テーブルがあります。直接関係を持ちたい。を挿入/更新するときにMany、関連する を挿入/更新したくありません。オブジェクトの適切な ID で をOne更新するだけです。idOneMany

このブログ投稿を見つけましたが、それは Hibernate を使用しており、まだ結合テーブルを使用していると思います:

@Entity
public class Many {
    @Id
    public String id;

    @Column(name="idOne")
    private String idOne;

    @ManyToOne
    @JoinColumn(name="idOne", nullable=false, insertable=false, updatable=false)
    private One one;
}

試してみましたが、まさにこのエラーが発生しました。

私はそれとどのように戦っているのか理解できません。私の目標は、いくつかの参照データ(クラスとしての国のリストなど)と、参照を作成/更新せずに作成/更新するOne「作業項目」(クラスとしての町のような)のリストを保持するテーブルを持つことですManyデータ、Manyオブジェクト内の外部キーのみ。

4

2 に答える 2

1

それが一方向の関連付けでありMany、所有側である場合 (2 番目の例のように)、間違った方向に向かっています。(insertable=false および updateable=false で行われたように) 一方向の関係の所有側で更新と挿入の責任を委任することはあまり意味がありません。

編集:更新された回答したがって、所有側に外部キー列がある多対1が必要です。これを試して

@Entity
public class Many {
    @Id
    String id;

    @ManyToOne
    @JoinColumn(name = "foreignKeyColumn")
    One one;
}
于 2012-11-08T11:27:13.310 に答える
1
@Entity
public class A {
    @Id
    String id;

    @OneToOne(cascade=CascadeType.ALL)
    B b;
}

@Entity
public class B {
    @Id
    String id;
}

そして、初期オブジェクトを次のように永続化した場合

tx.begin();
A a = new A("FirstA");
B b1 = new B("FirstB");
B b2 = new B("SecondB");
a.setB(b1);
em.persist(a);
em.persist(b2);
tx.commit();

... (some time later)
tx.begin();
A a = em.find(A.class, "FirstA");
B b2 = em.getReference(B.class, "SecondB");

// update the B in A to the second one
a.setB(b2);
tx.commit();

これにより、A と B の間の FK が更新されます。

于 2012-11-16T08:43:41.713 に答える