このコンテキストでアプリケーションを作成したいと思います:Zk 6、Spring v3.1.1、JPA 2.0、Hibernate 4.1.4、すべてアノテーション付きですが、JPAコンセプトのpbがいくつかあります。
ケーススタディの種類は次のとおりです。
3つのテーブル、すべて結合テーブルを介してリンクされています。カーディナリティ0、nを扱っています。
したがって、T_E_USER、T_E_TYPE、およびT_E_AIRがあります。各テーブルには、数値IDと単純なVARCHARフィールドがあります。
結合テーブルは、T_J_USR_TPE_AIRを使用して作成され、外部キーによって参照される3つのIDを使用して、構成された主キーを形成します。
エンティティ(バージョンJPA)を生成するためにHibernateツールを使用しています。そして、そこから問題が始まります…。
各エンティティクラスに、アノテーション@OneToManyで設定されたタイプの属性があります。
複合キーのアノテーションEmbeddedIdを持つ複合型(別のクラス)のid属性を持つ結合を表すクラスがあります。そして、アノテーション@ManyToOneで3つのエンティティを表す属性。
これが私の質問です。それが私が混乱しているところだからです。
- エンティティのアノテーション@OneToManyの「mappedBy」属性に設定する必要があるのはどれですか?
- 結合を表すクラスエンティティを実行する必要がありますか?
- CASCADEはどうですか?このコンテキストでこれを使用して、結合テーブルを「自動的に」強化することは可能ですか?または、情報を自分で永続化するために、参加のクラス代表を手動でインスタンス化する必要がありますか?
私に助けを与えることができるどんな親切な魂にも前もって大いに感謝します。
答えてくれてありがとうございますが、片方が「いいえ」と言ったら「はい」と答えました笑
これが私が日中にしたことですが、私はまだテストされていません。
各エンティティテーブルで、「join」エンティティで定義された属性に設定されたmappedByを使用して@OneToManyリレーションを追加しました。
@OneToMany(fetch = FetchType.LAZY,
mappedBy = "aircraft",
cascade = { CascadeType.REMOVE })
private Set<UserConfig> userConfigs = new HashSet<UserConfig>(0);
..。
@OneToMany(fetch = FetchType.LAZY,
mappedBy = "userAccount",
cascade = { CascadeType.REMOVE })
private Set<UserConfig> userConfigs = new HashSet<UserConfig>(0);
..。
@OneToMany(fetch = FetchType.LAZY,
mappedBy = "referenceType",
cascade = { CascadeType.REMOVE })
private Set<UserConfig> userConfigs = new HashSet<UserConfig>(0);
そして、結合テーブルの新しいエンティティを作成しました。
@Entity
@Table(name = "T_J_USR_RFT_AIR_URA")
public class UserConfig implements java.io.Serializable {
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name = "airId",
column = @Column(name = "URA_AIR_ID", nullable = false)),
@AttributeOverride(name = "usrId",
column = @Column(name = "URA_USR_ID", nullable = false)),
@AttributeOverride(name = "rftId",
column = @Column(name = "URA_RFT_ID", nullable = false))
})
private UserConfigId id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "URA_RFT_ID", nullable = false, insertable = false, updatable = false)
private ReferenceType referenceType;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "URA_USR_ID", nullable = false, insertable = false, updatable = false)
private UserAccount userAccount;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "URA_AIR_ID", nullable = false, insertable = false, updatable = false)
private Aircraft aircraft;
...
getter & setter
}
UserConfigIdは次のとおりです。
@Embeddable
public class UserConfigId implements java.io.Serializable {
@Column(name = "URA_AIR_ID", nullable = false)
private Integer airId;
@Column(name = "URA_USR_ID", nullable = false)
private Integer usrId;
@Column(name = "URA_RFT_ID", nullable = false)
private Integer rftId;
...
getter & setter
}
この習慣についてどう思いますか?
結合に関連付けられているすべての要素を削除するために、結合テーブルのオブジェクトが削除された場合は、「カスケード」を使用しました。
問題無いですか ?
とにかくトムありがとう、私はあなたのリンクを分析します。JMelnykにも感謝します。
この場合のベストプラクティスを示したい場合は、大歓迎です。