2

プロジェクトで多く使用するJPAで何かをしようとしていますが、行き詰まっています。

2 つのエンティティ + 一種の「接着剤」エンティティがあります。

  • クラスA
  • クラスB
  • のり

リストに新しい Glues が設定された新しい ClassA を追加したいのですが、ClassB は既に存在しています。

それは次のようになります:

クラスA 1 | 接着剤 1 1 | クラスB 1
クラスA 1 | 接着剤 1 2 | クラスB 2
クラスA 1 | 接着剤 1 3 | クラスB 3
クラスA 1 | 接着剤 1 4 | クラスB 4

ClassA とすべての Glues が挿入されると言ったように、ClassA には挿入される新しい Glues のリストがあります。

どうぞ :

@Entity
public class ClassA implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    (...)

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "classA")
    private List<Glue> glueList;

    (...)
}

@Entity
public class ClassB implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    (...)
}

@Entity
public class Glue implements Serializable {

    @EmbeddedId
    protected GluePK gluePK;

    @JoinColumn(name = "id_class_a", referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private ClassA classA;

    @JoinColumn(name = "id_class_b", referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
    @ManyToOne(optional = false)
    private ClassB classB;

    (...)
}

@Embeddable
public class GluePK implements Serializable {

    @Basic(optional = false)
    @NotNull
    @Column(name = "id_class_a", nullable = false)
    private int idClassA;

    @Basic(optional = false)
    @NotNull
    @Column(name = "id_class_b", nullable = false)
    private int idClassB;

    (...)
}

ClassA を永続化しようとすると、次のような結果が得られます。

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 子行を追加または更新できません: 外部キー制約が失敗しました ( bdd. glue, CONSTRAINT constraint_nameFOREIGN KEY ( id_class_a) REFERENCES ClassA( id) ON DELETE NO ACTION ON UPDATE NO ACTION)

Glues には ClassA の参照セットがないと彼が不満を言っているのは理解していますが、ClassA を保持しているときにそれを埋めてほしいと思います。

これは達成可能ですか?そうでない場合、それを行う最善の方法は何ですか?

特定のベンダーのトリック (私は eclipselink を使用しています) なしで JPA にとどまりたいのですが、一部のベンダーが簡単にそれを実行できる場合は、私はそれを選びます。

ありがとう!

4

1 に答える 1

4

EmbeddedId を削除し、代わりに IdClass を使用して、@Id を @ManyToOne マッピングに追加します。

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

または、Glue に独自の ID を与えることもできます。

@ManyToOne から insertable = false、updatable = false を削除して、EmbeddedId に移動することもできます。

于 2012-07-03T13:21:36.033 に答える