賞金將在 7 天后到期。此問題的答案有資格獲得 50聲望賞金。 xmen-5正在從信譽良好的來源尋找答案:
解釋為什么會出現奇怪的行為并給出解決方案。
我有一個部門物體,一個部門最多可以有一個地址,一個地址也是一個物體,可以在多個部門之間共享。
為了在休眠中練習多對一關系,我決定有一個 JoinTable,這是我的物體定義:
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
@Getter
@Setter
@Entity(name = "Address")
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String city;
}
地址物體:
@Getter
@Setter
@Entity(name = "department")
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "person_id")
private Person manager;
// many departments can have the same address
// one department should have at most one address
// todo not working as expected, we are not fetching the address of the department
@ManyToOne(fetch = FetchType.EAGER)
@JoinTable(name = "department_address",
joinColumns = @JoinColumn(name = "address_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "department_id", referencedColumnName = "id"))
private Address address;
}
Person 物體(只是為了示例的完整性而添加):
@Getter
@Setter
@Entity(name = "person")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "address_id")
private Address address;
}
當使用 spring data jpa 從資料庫中檢索部門時,就像我們沒有獲取與部門關聯的地址資料一樣。
這是資料庫的內容:
表部
| ID | 姓名 | person_id |
|---|---|---|
| 23 | 它 | 3 |
表地址
| ID | 姓名 |
|---|---|
| 2 | 巴黎 |
| 3 | 哈拉吉夫 |
表部門地址
| ID | address_id | 部門編號 |
|---|---|---|
| 2 | 2 | 23 |
存盤庫定義:
public interface DepartmentRepository extends JpaRepository<Department, Long> {}
在查找給定部門時,以我為例,它是部門 23,部門/23:
Department department = departmentRepository.findById(id).get();
Address address = department.getAddress();
System.out.println("address = " address);
地址始終為空,即使對于部門 23,在表 department_address 中有一行,這里是部門的輸出
System.out.println("department = " department);
department = Department(id=23, name=IT, manager=Person(id=3, name=hamida, address=Address(id=3, city=kharajiv)), address=null)
這是列印的 sql 查詢:
Hibernate: select department0_.id as id1_1_0_, department0_.person_id as person_i3_1_0_, department0_.name as name2_1_0_, department0_1_.department_id as departme1_2_0_, person1_.id as id1_3_1_, person1_.address_id as address_3_3_1_, person1_.name as name2_3_1_, address2_.id as id1_0_2_, address2_.name as name2_0_2_, address3_.id as id1_0_3_, address3_.name as name2_0_3_ from department department0_ left outer join department_address department0_1_ on department0_.id=department0_1_.address_id left outer join person person1_ on department0_.person_id=person1_.id left outer join Address address2_ on person1_.address_id=address2_.id left outer join Address address3_ on department0_1_.department_id=address3_.id where department0_.id=?
uj5u.com熱心網友回復:
左外連接地址 address3_ on department0_1_.department_id=address3_.id whe
也許我看錯了,但部門 ID 和地址 ID 不匹配。它必須是 deparment0_1.address_id = address3_.id
您可以嘗試將 inversecolumn 更改為 address_id
joinColumns = @JoinColumn(name = "deparment_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "address_id", referencedColumnName = "id"))
private Address address
uj5u.com熱心網友回復:
@JoinTable 注解用于指定多對多表關系的映射。在這種情況下使用 @ManyToMany
uj5u.com熱心網友回復:
joinColumns:分配與物體(在您的情況下為部門)本身相關的第三個表的列。inverseJoinColumns:分配與關聯物體相關的第三個表的列(在您的情況下為地址)。
你的是倒置的。您在 inverseJoinColumns 中有擁有物體(部門),在 joinColumns 中有地址
連接表檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/447263.html
上一篇:使用非物體類作為原生查詢的結果類
