gpt4 book ai didi

hibernate - JPA/Hibernate Join 和 Fetch 单列

转载 作者:行者123 更新时间:2023-12-03 12:56:33 27 4
gpt4 key购买 nike

我是 JPA/Hibernate 的新手。假设我有这两个表:

  • Employee (Id, Name, DeptId, ..)//DeptId 是外键。
  • Department (Id, DeptName, ..)//部门单独持久化

  • 和实体如下:
    @Entity
    public class Employee {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;
    private String name;
    private long salary;

    @OneToOne(cascade = {CascadeType.PERSIST})
    @JoinColumn(name="DEPT_ID")
    private Dept dept;
    ...
    }

    @Entity
    public class Dept {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;
    private String name;
    ...
    **other huge collections with eager fetch ***
    }

    在我的应用程序 DAO 中,每当我访问 Employee 实体时,我只需要将部门名称作为员工实体的一部分,而无需来自部门表的其他内容。
  • 如何获取部门。仅名称列而不是员工实体中的整个部门行(需要避免急切地获取部门制作的大量集合)?如果是这样,我应该使用哪些注释?
  • 在这种情况下如何处理级联?
  • 最佳答案

    最好的选择是使集合延迟加载,然后将需要集合的查询更改为急切加载(使用 join fetch)。如果您有充分的理由不这样做,那么您可以尝试以下解决方法。

    您可以使用投影查询。这将为每个结果生成一个 [employee,name] 数组。

    select employee, employee.dept.name from Employee employee

    您可以使用@Formula 将 Employee 表中的属性映射到 Department 表中的列(请注意,此解决方案是特定于 Hibernate 的)
    class Employee {

    @Formula("(select deptName from Department where Department.id = DEPT_ID)"
    String deptName;

    }

    另一种选择是创建一个没有集合的新类 DeptLite。将其映射为只读 - @org.hibernate.annotations.Entity(mutable=false) .
    @Entity
    public class Employee {

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;
    private String name;
    private long salary;

    @OneToOne(cascade = {CascadeType.PERSIST})
    @JoinColumn(name="DEPT_ID")
    private Dept dept;

    @OneToOne(updatable=false,insertable=false)
    @JoinColumn(name="DEPT_ID")
    private DeptLite deptLite;

    ...
    }

    @Entity
    @org.hibernate.annotations.Entity(mutable=false)
    class DeptLite {

    }

    关于hibernate - JPA/Hibernate Join 和 Fetch 单列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12310688/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com