java - 一对一关系 hibernate 导致许多查询

标签 java oracle hibernate

我有一对一关系的下课

@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(mappedBy = "person", cascade = CascadeType.ALL)
    private DrivingLicense drivingLicense;
}

@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
    @JoinColumn(name = "PERSON_ID", unique = true)
    private Person person;
}

目前每个表有3行

但是当我像下面这样对 person 进行查询时

Query query = entityManager.createQuery("from Person p");

在获得结果列表后,它导致了太多的查询,如下所示;

Hibernate: select person0_.PERSON_ID as PERSON_ID1_1_, person0_.PERSON_NAME as PERSON_NAME2_1_ from PERSON person0_
Hibernate: select drivinglic0_.LICENSE_NUMBER as LICENSE_NUMBER1_0_1_, drivinglic0_.DATE_OF_ISSUE as DATE_OF_ISSUE2_0_1_, drivinglic0_.PERSON_ID as PERSON_ID3_0_1_, person1_.PERSON_ID as PERSON_ID1_1_0_, person1_.PERSON_NAME as PERSON_NAME2_1_0_ from DRIVING_LICENSE drivinglic0_ left outer join PERSON person1_ on drivinglic0_.PERSON_ID=person1_.PERSON_ID where drivinglic0_.PERSON_ID=?
Hibernate: select drivinglic0_.LICENSE_NUMBER as LICENSE_NUMBER1_0_1_, drivinglic0_.DATE_OF_ISSUE as DATE_OF_ISSUE2_0_1_, drivinglic0_.PERSON_ID as PERSON_ID3_0_1_, person1_.PERSON_ID as PERSON_ID1_1_0_, person1_.PERSON_NAME as PERSON_NAME2_1_0_ from DRIVING_LICENSE drivinglic0_ left outer join PERSON person1_ on drivinglic0_.PERSON_ID=person1_.PERSON_ID where drivinglic0_.PERSON_ID=?
Hibernate: select drivinglic0_.LICENSE_NUMBER as LICENSE_NUMBER1_0_1_, drivinglic0_.DATE_OF_ISSUE as DATE_OF_ISSUE2_0_1_, drivinglic0_.PERSON_ID as PERSON_ID3_0_1_, person1_.PERSON_ID as PERSON_ID1_1_0_, person1_.PERSON_NAME as PERSON_NAME2_1_0_ from DRIVING_LICENSE drivinglic0_ left outer join PERSON person1_ on drivinglic0_.PERSON_ID=person1_.PERSON_ID where drivinglic0_.PERSON_ID=?

很明显,为了获取 3 行,hibernate 触发了 4 个查询,如何解决这个问题?我在人际关系方面做错了什么吗?

更新

现在如果我像这样获取驾驶执照

Query query = entityManager.createQuery("from DrivingLicense dl");

更糟糕的是,触发了 7 个查询。

最佳答案

要拥有独立于 JPA 供应商的解决方案,您可以使用以下 JPQL 查询。

获取所有拥有DrivingLicensePerson

Query query = entityManager.createQuery("from Person p join fetch p.drivingLicense");

让所有 Person 独立,无论他们是否有 DrivingLicense

Query query = entityManager.createQuery("from Person p left join fetch p.drivingLicense");

或使用Criteria API

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Person> criteriaQuery = criteriaBuilder.createQuery(Person.class);
Root<Person> root = criteriaQuery.from(Person.class);
root.fetch("drivingLicense", JoinType.INNER);
criteriaQuery.select(root);
List<Person> resultList = em.createQuery(criteriaQuery).getResultList();

回复

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<Person> criteriaQuery = criteriaBuilder.createQuery(Person.class);
Root<Person> root = criteriaQuery.from(Person.class);
root.fetch("drivingLicense", JoinType.LEFT);
criteriaQuery.select(root);
List<Person> resultList = em.createQuery(criteriaQuery).getResultList();

关于java - 一对一关系 hibernate 导致许多查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32644033/

相关文章:

java - Docker 运行失败并出现 NoClassDefFoundError - 即使依赖的 jar 位于类路径中

java - 如何更改 ArrayNode 中的元素值

oracle - 是否可以为oracle中创建主键时创建的索引命名?

database - 显式连接与隐式连接?

java - 使用 select max() 然后插入 max() + 1 的 Hibernate 并发问题

hibernate - WildFly 9.0.1.Final 附带了哪些版本的库

java - 想要使用共享的 @BeforeClass/@AfterClass 和 Spring App Context 运行许多 jUnit 测试类

Java Swing - UI 卡住

java - 如何使用 itext 在 Java 表格内的列表中显示项目符号点?

java - JPA Hibernate 中间表 - 重新提交