我有兩個物體:Person 和 Passport。我將其映射為雙向。
護照(父母):
@Entity
@Table(name = "passports")
public class Passport {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private Integer serial;
private Integer number;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "person_id", referencedColumnName = "id")
private Person person;
人(孩子):
@Entity
@Table(name = "people")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
@OneToOne(mappedBy = "person", fetch = FetchType.LAZY)
private Passport passport;
兩種關系獲取型別都是 LAZY。
現在我試圖找到唯一的孩子:
Person p = entityManager.find(Person.class, 1);
System.out.println(p.getName());
Hibernate 生成兩個 SELECT 陳述句而不是一個(必須只選擇一個人)。
Hibernate: select p1_0.id,p1_0.name from people p1_0 where p1_0.id=?
Hibernate: select p1_0.id,p1_0.number,p1_0.person_id,p1_0.serial from passports p1_0 where p1_0.person_id=?
我希望只有一個選擇,但得到兩個。
為什么 LAZY 不起作用?我究竟做錯了什么?
uj5u.com熱心網友回復:
對于所有其他關系型別,FetchType.LAZY將按預期作業,但@OneToOne它是不同的。
如果您更改Person物體以使其與 沒有關系Passport,并且Passport具有:
@OneToOne(fetch = FetchType.LAZY)
@MapsId
private Person person;
然后,如果您正在使用 Spring JPA 并且您想為a 找到Passport一個Person,您可以這樣做passportRepository.findByPerson(person)。
或者,如果您正在使用entityManager,您可以找到它:
entityManager.find(Passport.class, person.getId());
更多解釋請閱讀https://thorben-janssen.com/hibernate-tip-lazy-loading-one-to-one/。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/528170.html
標籤:爪哇休眠jpa
