テーブル間の3マルチデータベース関係があります。
実体関連システム設計の三種類があります:多対多と1対1の関係。注:多くの1つ、多くのものに:多くの関係は2として見ることができます。私は、より正確な4を話すようにします。
基本手順は次のとおりです。
第一工程:まず、2つのテーブル間の関係を決定します。
ステップ2:2つのデータベーステーブルの関係で実現する
第3のステップは:エンティティ・クラス内の2つのエンティティ間の関係について説明
ステップ4:設定をリレーションシップ・マッピングエンティティクラスとデータベーステーブル(フォーカス)
アイデアの分析:
設立表の関係
多くの関係では、我々は、メインテーブルの当事者、テーブルからマルチパーティコールそれを呼び出すために使用されます。データベース内対多の関係は、外部キー制約データベースを使用する必要があります。
何である外部キーが
意味することは、プライマリ・テーブルのプライマリ・キー値を参照して、列がテーブルから外部キーである、ものです。
シーン分析
、顧客がエンティティクラスは、顧客が複数の連絡先情報を持って反映するので、それは、一つのコンタクトよりも多く含まれている必要があり、いくつかの一つであるため、エンティティクラスでは、
顧客エンティティクラス
/ ** * Customerエンティティクラス *注釈が明示的にJPAの仕様を使用している ので、リードパックの下で*は、インポートされなければならないのjavax.persistenceパッケージ * / @Entity // 現在のクラスがエンティティクラスで表し @Table(名前= "顧客「)// エンティティクラスとテーブルとの間の対応を確立 @data パブリック クラス顧客を実装シリアライズ{ @Id //は、現在のマスター鍵がプライベートプロパティであることを示して @GeneratedValue(戦略= GenerationType.IDENTITYを)//は、ポリシーは、主キーを指定生成します @Column(名=「CID」)// 指定されたデータベーステーブルおよび列は、対応するCID プライベートロングCIDを、 @Column(名 =「CNAME」)// 対応する指定されたデータベーステーブルおよび列CNAME プライベート文字列CNAMEと、 @Column(名 = 「ソース」)// 指定されたソースとデータベーステーブル内の対応する列 のプライベート文字列のソース、 @Column(名 =「産業」)// データベーステーブルを指定し、列は業界に対応する プライベート文字列産業、 @Column(名 =「レベル」)// レベルと対応する指定されたデータベーステーブルの列 プライベート文字列レベルを、 @Column(名 =「アドレス」)// 指定されたデータベーステーブルおよび対応する列アドレス プライベート文字列アドレスを、 @Column(名 =「電話」)// 指定しデータベーステーブルのphoneカラム対応 のプライベート文字列電話を; // のconfigureアカウントと接触対多の関係 @OneToMany(targetEntity =総合司会者。クラス) @JoinColumn(名前= "CUST_ID"、referencedColumnNameと= "CUST_ID" ) プライベート設定<総合司会> linkmans = 新しい HashSetの<総合司会>(0 ); }
連絡先のエンティティクラス
/ ** *联系人的实体类(数据模型) * / @Entity @Table(名 = "総合司会者" ) @Data パブリック クラス総合司会者の実装シリアライズ{ @Id @GeneratedValue(戦略 = GenerationType.IDENTITYを) @Column(名 = 「蓋」) プライベートロング蓋。 @Column(名前 = "LNAME" ) プライベート文字列LNAME。 @Column(名前 = "lgender" ) プライベート文字列lGender。 @Column(名前 = "lphone" ) プライベート文字列lPhone。 @Column(名 = "lmobile" ) プライベート文字列lMobile; @Column(名 = "lemail" ) プライベート文字列lEmail; @Column(名 = "lposition" ) プライベート文字列lPosition; @Column(名 = "lmemo" ) プライベート文字列lMemo; // 外部キーマッピング:クライアントに対応した複数のコンタクト (= targetEntity顧客@ManyToOneをクラス) @JoinColumn(名前 =「CUST_ID」、referencedColumnNameと=「CUST_ID」) プライベート顧客の顧客; //は、その主キーを使用します対応するコンタクト外部キーテーブル }
ノートマッピング命令
@OneToMany:
アクション:複数のマッピング関係を確立する
属性を:
targetEntityClass:指定のマルチバイトコードクラスの数
mappedBy:指定メインテーブルのエンティティクラステーブルから参照されたオブジェクトの名前。
カスケードは:使用するカスケード操作が指定
フェッチ:かどうか、使用遅延読み込みに指定
orphanRemoval:削除孤児にするかどうかを
@ManyToOneの
役割:多関係を確立するには、
属性:
targetEntityClass:バイトコードエンティティクラスの指定した1つの
カスケード:あなたが使用したいですカスケード操作は、
フェッチ:指定した遅延ロードを使用するかどうか
のオプション:関連はオプションです。falseに設定されている場合、それは常に空でない関係を存在している必要があります。
@JoinColumn
効果:主キーフィールドの対応関係とは、外部キー列を定義します。
プロパティ:
名前:外部キーの名前は、フィールドを指定
referencedColumnNameとを:指定主テーブル参照される主キーフィールドの名前
ユニークで:ユニークです。デフォルト値だけではない
NULL可能:空を許可するかどうか。デフォルト値は、ことができます。
挿入可能:挿入を可能にするかどうか。デフォルト値は、ことができます。
更新可能:更新を許可するかどうか。デフォルト値は、ことができます。
columnDefinition:定義情報欄。
テスト
@RunWith(SpringJUnit4ClassRunner。クラス) @ContextConfiguration(場所 = "CLASSPATH *:* applicationContext.xmlを" ) パブリック クラス {OneToManyTest @Autowired プライベートCustomerDao customerDao; @Autowired プライベートLinkManDao linkManDao; / ** 動作保存 要件: クライアントとAを節約接触 要件: クライアントオブジェクトを作成し、接触がオブジェクトに クライアントと接点間の対応関係(双方向対多の関係) *顧客に最初に接触保存し、保存し、 *質問: 私たちは、双方向のビルド時に*を関係の後、メインテーブル保存して、テーブルから救う: * 2つの挿入や更新が生成されます *実際の開発を、我々は2つだけの挿入を必要としています。 * / @Test @Transactional // 開いているトランザクション @Rollback(偽)// ロールバックしないように設定 公共 のボイドtestAdd(){
顧客C = 新しい新しい顧客を(); c.setCustName( "ジョー・スミス" ); c.setCustLevel( "VIP顧客" ); c.setCustSource( "58都市" ); c.setCustIndustry( "商用オフィス" ); c.setCustAddress( "ソフトウェアパーク" ); c.setCustPhone( "010から10021123" );
総合司会者L = 新新総合司会者() ; l.setLkmName( "張" ); L.setLkmGender("男性" ); l.setLkmMobile( "15511111111" ); l.setLkmEmail( "[email protected]" ); l.setLkmPosition( "議長" ); l.setLkmMemo( "愛想" );
c.getLinkMans( )(L)を.add;
l.setCustomer(C); customerDao.save(C); linkManDao.save(L); } }
ケースを保存することにより、我々は、双方向の関係を設定した後、メンテナンスを受ける権利を放棄する当事者である2つの挿入文、冗長UPDATE文、当社のソリューションは非常に簡単であるという考えを、送信することを見ることができます
/ ** *次のように外部キー設定が変更されます維持する権利を放棄 * / // @OneToMany(targetEntity = LinkMan.class) // @JoinColumn(名前= "CUST_ID"、referencedColumnNameと= "CUST_ID") // セット @OneToMany(mappedBy = "顧客")
[削除]
@Autowired プライベートCustomerDao customerDao。 @Test @Transactional @Rollback(偽)// 设置为不回滚 公共 のボイド削除(){ customerDao.delete( 1リットル); }
削除操作は以下のとおりです。
テーブルからの削除データ:いつでも削除することができます。 マスターテーブルのデータを削除します 。表からのデータならば 1 、デフォルトでは、それが外部キーフィールドがnullに設定した後、マスター・テーブル・データを削除されるでしょう。データベーステーブルの構造場合は、null以外の外部キーフィールドの制約で、デフォルトが与えられます。 2 構成との間の相関関係を維持することの放棄が削除できない場合は削除すると、それはフィールドから外部キーテーブルの更新に行っていないため、(および許可するかどうか、外部キーフィールドには、それが問題で、nullではありませんです)。 3 あなたは、削除の参照をカスケードを使用して、削除したい場合は、 テーブルからデータを参照していません。ただ、削除 実際の開発を、カスケード削除は注意します!(多くの場合)
カスケード接続された操作:同時操作は、操作を参照するターゲット関連オブジェクト
使用方法:カスケードは、操作体の注釈にのみ配置されました
/ ** *カスケード:カスケード構成操作 * CascadeType.MERGEカスケードアップデート * CascadeType.PERSISTカスケードが保存されます: * CascadeType.REFRESHカスケードリフレッシュ: * CascadeType.REMOVEカスケード削除: * CascadeType.ALLに含まれるすべての * / @をOneToMany(mappedBy = "顧客"、カスケード= CascadeType.ALL中)