1

このコンテキストでアプリケーションを作成したいと思います: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にも感謝します。

この場合のベストプラクティスを示したい場合は、大歓迎です。

4

2 に答える 2

1

3方向結合には注意が必要です。結合テーブルにエンティティを使用して行ったことは、おそらく正しいことだと思います。あなたの質問に答えるには:

  1. 属性@OneToManyは、結合テーブルをマッピングするエンティティを参照します。それらは、そのエンティティmappedByの適切な属性である必要があります。@ManyToOne
  2. はい、残念ながら、結合テーブルのエンティティがこれを行うための最良の方法です。
  3. カスケードを使用して、オブジェクトをデータベースに自動的に追加できますが、オブジェクトを作成することはできません。コードで結合エンティティのインスタンスを作成する必要があります。
于 2012-08-07T09:16:30.420 に答える
0

エンティティのアノテーション@OneToManyの「mappedBy」属性に設定する必要があるのはどれですか?

mappedBy属性は、参加しているプロパティ名を表します。続きを読む...

たとえば、エンティティの(mappedBy)プロパティに結合されているがAnyEntity保持され、そのプロパティが関連付けを保持します。List<Employee>departmentEmployeedepartment

結合を表すクラスエンティティを実行する必要がありますか?

いいえ、結合テーブルのエンティティクラスを提供していません。

CASCADEはどうですか?このコンテキストでこれを使用して、結合テーブルを「自動的に」強化することは可能ですか?または、情報を自分で永続化するために、参加のクラス代表を手動でインスタンス化する必要がありますか?

はい、必要なカスケードタイプで関連付けをマークすることにより、エンティティとそれ自体の関連付けを強化することができます。

たとえば、Department保持するものがList<Employee>あり、CascadeType.PERSISTを従業員に配置します。次に、部門オブジェクトにそのプロパティと従業員を入力します。終了したら、部門のみを永続化し、従業員にカスケード操作を行います。

于 2012-08-07T07:58:04.187 に答える