[英]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.