2017-12-13 14 views
2

:私は今、これらの2つのエンティティを接続して定義するにはどうすればよいJPAエンティティクラスの接続方法は?これら2つのエンティティがある場合(1対多/多対一)

@Entity 
@Table(name = "CUSTOMER") 
public class Customer { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column(name = "FIRST_NAME") //Attributes in the entitiy 
    private String firstName; 

    @Column(name = "LAST_NAME") 
    private String lastName; 

    @Column(name = "ADDRESS") 
    private String address; 

@Entity 
@Table(name = "ADDRESS") 
public class Address { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column(name = "STREET_NAME") //Attributes in the entitiy 
    private String streetName; 

    @Column(name = "HOUSE_NUMBER") 
    private int houseNumber; 

Customerは多くを持っていることAddresses

+2

グーグルで行ってください。私はSOにもたくさんの例があると思います。 – pirho

答えて

0

あなたは簡単にインターネット上で、この例のトンを見つけることができます。私は非常にObjectDB websiteを見てお勧めします。この特定のシナリオでは

、あなたは以下のようにそれらを定義することができますあなたの要求に基づいて:EDITを

@Entity 
@Table(name = "ADDRESS") 
public class Address { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column(name = "STREET_NAME") //Attributes in the entitiy 
    private String streetName; 

    @Column(name = "HOUSE_NUMBER") 
    private int houseNumber; 

    @ManyToOne(fetch = FetchType.LAZY) 
    private Customer customer; 
} 

@Entity 
@Table(name = "CUSTOMER") 
public class Customer { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column(name = "FIRST_NAME") //Attributes in the entity 
    private String firstName; 

    @Column(name = "LAST_NAME") 
    private String lastName; 

    @Column(name = "ADDRESS") 
    private String address; 

    @OneToMany(mappedBy = "customer") 
    private List<Address> addresses; 
} 

をとしてAddressクラスでは、あなたの顧客への参照を持っています多対多の関係の例を得るために、顧客と住所のエンティティに対して実装できる方法を次に示します。

最初に、2つの外部キーを持つ中間テーブルを用意する必要があります.1つは顧客テーブルを参照し、もう1つはアドレスを参照します。

select * from customer_address; 

customer_id | address_id 
------------------------ 
    12  |  15 
    12  |  14 
    12  |  13 
    2  |  15 
    2  |  13 
    19  |  11 

今、あなたはあなたの注釈を更新してエンティティ間の多くの関係に多くを推測するために、このテーブルを使用するJPAを教えてください:あなたはそれのデータは、このようなものになるだろう、この中間テーブルcustomer_addressに名前を付けるとします。

Customerクラス:

  • @ManyToMany:関係
  • @JoinTableのタイプを示す:指定するために使用されるこのコード注釈をJPAに以下の情報を提供するために使用されるで

    @Entity 
    @Table(name = "CUSTOMER") 
    public class Customer { 
    
        @Id 
        @GeneratedValue(strategy = GenerationType.AUTO) 
        private Long id; 
    
        @Column(name = "FIRST_NAME") //Attributes in the entity 
        private String firstName; 
    
        @Column(name = "LAST_NAME") 
        private String lastName; 
    
        @Column(name = "ADDRESS") 
        private String address; 
    
        @ManyToMany(mappedBy = "customer") 
        @JoinTable(name = "customer_address", 
         joinColumns = @JoinColumn(name = "customer_id", referencedColumnName = "id"), 
         inverseJoinColumns = @JoinColumn(name = "address_id", referencedColumnName = "id")) 
        private List<Address> addresses; 
    } 
    
    @Entity 
    @Table(name = "ADDRESS") 
    public class Address { 
    
        @Id 
        @GeneratedValue(strategy = GenerationType.AUTO) 
        private Long id; 
    
        @Column(name = "STREET_NAME") //Attributes in the entitiy 
        private String streetName; 
    
        @Column(name = "HOUSE_NUMBER") 
        private int houseNumber; 
    
        @ManyToMany(mappedBy = "customer") 
        @JoinTable(name = "customer_address", 
         joinColumns = @JoinColumn(name = "address_id", referencedColumnName = "id"), 
         inverseJoinColumns = @JoinColumn(name = "customer_id", referencedColumnName = "id")) 
        private List<Customer> customer; 
    } 
    

    実際の関係データを保持するテーブルであり、以下の属性を有する。

    • joinColumns@ManyToManyアノテーションを含むエンティティクラスを参照する中間テーブルの列を定義します。 Customerクラスでは、外部キーである列をcustomerテーブルに定義し、Addressクラスでは、addressテーブルへの外部キーである列を定義します。
    • inverseJoinColumns:これはjoinColumnプロパティとまったく反対です。 @ManyToManyアノテーションの反対側にあるエンティティクラスを参照する中間テーブルの列を定義します。Customerクラスでは、外部キーである列をaddressテーブルに定義し、Addressクラスでは、customerテーブルに外部キーである列を定義します。

私は私の記述はそれがあるべきように理解/読み取り可能ではないことを知っているが、あなたはそれが@JoinTable注釈を記述することは容易ではないことを知っています。サンプルコード自体を読み込み、列/プロパティ名を照合して、それぞれの意味を調べる方が簡単です。また、ObjectWebウェブサイト(サンプルも含まれています)で確認できます。

+0

ありがとう!多対多のrealtionではどのようになっていますか? – user10

+0

@ user10多かれ少なかれ多くの関係の別のシナリオで自分の答えを更新しました – zaerymoghaddam

+0

ありがとう! – user10

-1

このエンティティが参照しているテーブルを定義するにはxmlファイルが必要です。フィールドとその関係をそこに追加することができます。

例:

<entity class="class" access="FIELD"> 
<table name="class_table" /> 

<attributes> 
    <id name="classId"> 
     <column name="class_id" /> 
    </id> 

    <basic name="className"> 
     <column name="case_name" /> 
    </basic> 

<!-- Foreign key many-to-one --> 
    <many-to-one name="classType" fetch="LAZY"> 
     <join-column name="class_type_id" referenced-column-name="class_type_id" /> 
    </many-to-one> 

<!-- Foreign key one-to-many --> 
    <one-to-many name="class_list" mapped-by="class" fetch="LAZY" /> 
</attributes> 
</entity> 
+0

エンティティを作成するコードで直接行うことはできませんか? – user10

+0

@ user10あなたは、簡単に注釈を追加することができますかManyToOneかOneToMany、それからあなたは大丈夫でしょう、私はあなたが別のアプローチを求めていると思いました。 – PSo

+0

私はちょうどそれを学んでいるので、私はそれを行うための最も簡単な方法を探しています... – user10

関連する問題