簡體   English   中英

如何連接JPA實體類? (一對多/多對一)

[英]How to connect JPA entity classes? (one-to-many/many-to-one)

如果具有這兩個實體:

@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

您可以通過Internet輕松找到大量此類示例。 我強烈建議您看一下ObjectDB網站

對於此特定方案,可以如下定義它們:

@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;
}

並在“地址”類別中引用您的客戶為:

@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;
}

編輯:根據您的請求,為一個具有多對多關系的示例,以下是您可以為您的Customer和Address實體實現它的方法:

首先,您應該有一個包含兩個外鍵的中間表,一個是指客戶表,另一個是指地址。 假設您將此中間表命名為customer_address ,則其數據將如下所示:

select * from customer_address;

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

現在,您應該更新注釋,並告訴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;
}

在此代碼中,注釋用於向JPA提供以下信息:

  • @ManyToMany :指示關系的類型
  • @JoinTable :用於指定保存實際關系數據的表,並具有以下屬性:
    • joinColumns :定義中間表中的列,該列引用包含@ManyToMany批注的實體類。 Customer類中,它定義為customer表外鍵的列,而在Address類中,它定義為address表外鍵的列。
    • inverseJoinColumns :與joinColumn屬性完全相反。 定義中間表中的列,該列引用@ManyToMany批注另一側的實體類。 Customer類中,它定義為address表外鍵的列,而在Address類中,它定義為customer表外鍵的列。

我知道我的描述並不像應該的那樣可讀/易懂,但是您知道描述@JoinTable注釋並不容易。 讀取示例代碼本身並匹配列/屬性名稱以查找每個示例的含義將是一種更簡單的方法。 您也可以在ObjectWeb網站上檢查它(也包括一個示例)。

您應該有一個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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM