我是JPA/Hibernate的新手.假设我有这两个表:
和下面的实体:
@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 ***
}
Run Code Online (Sandbox Code Playgroud)
在我的应用程序DAO中,每当我访问Employee实体时,我只需要将部门名称作为员工实体的一部分,而不需要部门表中的任何其他部分.
最好的选择是使集合延迟加载,然后将需要集合的查询更改为急切加载(使用join fetch).如果您有充分的理由不这样做,那么您可以尝试以下变通方法.
您可以使用投影查询.这将导致每个结果的[employee,name]数组.
select employee, employee.dept.name from Employee employee
Run Code Online (Sandbox Code Playgroud)
您可以使用@Formula将Employee表中的属性映射到Department表中的列(请注意,此解决方案是特定于Hibernate的)
class Employee {
@Formula("(select deptName from Department where Department.id = DEPT_ID)"
String deptName;
}
Run Code Online (Sandbox Code Playgroud)
另一种选择是创建一个没有集合的新类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 {
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8679 次 |
| 最近记录: |