[英]Why cannot join 3rd table using JPA TopLink annotation?
我有簡單的3張桌子:
Users
-id
-name
Addresses
-id
-user_id //FK
-location
Phone
-id
-number
-address_id //FK
因此,應用於每個實體類的注釋將類似於:
用戶數
@OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
private List<Addresses> addresses;
地址
@ManyToOne()
@JoinColumn(name = "user_id")
private Users user;
@OneToMany(mappedBy = "address")
private List<Phone> phone;
電話
@ManyToOne()
@JoinColumn(name = "address_id")
private Addresses address;
上面的注釋應創建關系:
users (1) ----- (n) addresses (1) ------ (n) phone
然后,我在MySQL中創建了一些測試數據,並嘗試運行測試以查看返回“用戶”的查詢結果是否包括對地址和電話的引用。
我已經嘗試使用僅使用用戶和地址的2表,並得到了確定的結果。
現在,我添加了“電話”表,它是第3個表,然后出現以下錯誤。 這是聯接3個或更多表的正確方法嗎?
測試碼
try {
//get entity manager
String WEB_PU = "NoJSFPU";
EntityManagerFactory factory = Persistence.createEntityManagerFactory(WEB_PU);
EntityManager em = factory.createEntityManager();
//run query
List<Users> usersList = em.createQuery("SELECT u FROM Users u").getResultList();
//loop to print out each result
for(Users item : usersList) {
//display user info
System.out.println(item.getId() + " " + item.getFirstname());
List<Addresses> addrs = item.getAddresses();
for(Addresses ad : addrs) {
//display address info
System.out.println("Address:::" + ad.getLocation());
List<Phone> pho = ad.getPhone();
for(Phone p : pho) {
//display phone info
System.out.println("phone#" + p.getNumber());
}
}//end inner for
}//end outer for
System.out.println("==========================");
}
catch(Exception e) {
System.out.println("seriously wtf: " + e.toString());
System.exit(1);
}
錯誤
Exception Description: predeploy for PersistenceUnit [NoJSFPU] failed.
Internal Exception: Exception [TOPLINK-7250] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.ValidationException
Exception Description: [class local.test.session.Addresses] uses a non-entity [class local.test.session.Phone] as target entity in the relationship attribute [private java.util.List local.test.session.Addresses.phone].
我想通了。 必須使用@JoinTable批注指定。
現在,如果我運行測試代碼,則可以從所有3個表中獲取數據:D
地址
@ManyToOne
@JoinTable(name = "Addresses", joinColumns = {@JoinColumn(name="user_id",
referencedColumnName = "user_id") } )
private Users user;
電話
@ManyToOne
@JoinTable(name = "Phone", joinColumns = {@JoinColumn(name="address_id",
referencedColumnName = "address_id") } )
private Addresses address;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.