【问题标题】:Hibernate generates multiple select statementsHibernate 生成多个选择语句
【发布时间】:2015-12-06 14:01:57
【问题描述】:

不明白为什么需要多个选择,这里是类

DrivingLicense.java
@Entity
@Table(name = "DRIVING_LICENSE")
public class DrivingLicense {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "LICENSE_NUMBER")
    private int licenseNumber;
    @Column(name = "DATE_OF_ISSUE")
    private Date dateOfIssue;

    @OneToOne(mappedBy = "drivingLicense", cascade = CascadeType.ALL)
    private Person person;
}

Person.java
@Entity
@Table(name = "PERSON")
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "PERSON_ID")
    private int personId;
    @Column(name = "PERSON_NAME", nullable = false, length = 30)
    private String personName;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "D_LICENSE_NUMBER")
    private DrivingLicense drivingLicense;
}

TestClass

TypedQuery<Person> query = entityManager.createQuery("from Person p", Person.class);
query.getResultList();

这里query.getResultList正在生成以下sqls

Hibernate: select person0_.PERSON_ID as PERSON_ID1_1_, person0_.D_LICENSE_NUMBER as D_LICENSE_NUMBER3_1_, person0_.PERSON_NAME as PERSON_NAME2_1_ from PERSON person0_
Hibernate: select drivinglic0_.LICENSE_NUMBER as LICENSE_NUMBER1_0_0_, drivinglic0_.DATE_OF_ISSUE as DATE_OF_ISSUE2_0_0_, person1_.PERSON_ID as PERSON_ID1_1_1_, person1_.D_LICENSE_NUMBER as D_LICENSE_NUMBER3_1_1_, person1_.PERSON_NAME as PERSON_NAME2_1_1_ from DRIVING_LICENSE drivinglic0_ left outer join PERSON person1_ on drivinglic0_.LICENSE_NUMBER=person1_.D_LICENSE_NUMBER where drivinglic0_.LICENSE_NUMBER=?
Hibernate: select person0_.PERSON_ID as PERSON_ID1_1_1_, person0_.D_LICENSE_NUMBER as D_LICENSE_NUMBER3_1_1_, person0_.PERSON_NAME as PERSON_NAME2_1_1_, drivinglic1_.LICENSE_NUMBER as LICENSE_NUMBER1_0_0_, drivinglic1_.DATE_OF_ISSUE as DATE_OF_ISSUE2_0_0_ from PERSON person0_ left outer join DRIVING_LICENSE drivinglic1_ on person0_.D_LICENSE_NUMBER=drivinglic1_.LICENSE_NUMBER where person0_.D_LICENSE_NUMBER=?

我不知道为什么需要 2 次选择。在这两个表中只有一条记录。

【问题讨论】:

  • 是双向关系的问题吗?如果是,那么如何解决?
  • 您的关联不是 LAZY,因此 Hibernate 会加载所有内容。
  • 在同一个数据集上执行"from DrivingLicense dl"会发生什么?

标签: hibernate


【解决方案1】:

Hibernate EAGERly 默认加载关联,LAZY 加载如下。 这个很有名Hibernate N+1 select problem

 @OneToOne(fetch = FetchType.LAZY) 

【讨论】:

    猜你喜欢
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    相关资源
    最近更新 更多