我正在通过ProJPA2工作,目前在集合映射部分。 以下是wrt Maps的示例:
对我来说,这使文本难以理解。它提出了许多未解决的问题。其中之一是,如果我使用JPQL查询检索部门,应该如何填充employeesByCubicle地图?我了解使用“ mappedBy”本质上说:“我不负责维护这种关系:另一边是,您将在Employee实体的部门字段中找到该关系”。
但是,这不能满足以下问题:“如果检索Department的实例,应该如何填充employeeByCubicle?”
是否要由应用程序(即应用程序的开发人员)插入代码以手动填充关系另一端拥有的集合(例如employeeByCubicle)?在这种情况下,不能也不会希望仅通过从数据库中检索Department实体来填充employeeByCubicle映射:会是这种情况,因为该关系不属于Department?
谢谢。
编辑
我已经开始尝试实现本书中的示例,但是我不确定自己是否正确执行-我能够使小隔间/员工数据持久化,但是却出现“用于收集的空索引列”错误当我尝试使用“部门d的select d”检索它时,它会运行,并且除其他外,似乎尝试从EMPLOYEE表中提取数据:
Exception in thread "main" org.hibernate.HibernateException: null index column for collection: x.y.jpa.entity.Department.employeesByCubicle
我尝试添加nullable = true,optional = true,没有任何效果。
在数据库中,CUB_ID列指定为CUB_ID varchar(255) DEFAULT NULL
,这应该是它应该的-我希望此列可以为空。但是我无法使其工作,以便可以选择数据。我的映射有问题吗?
我的实体类别,员工和部门:
@Entity
public class Employee {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
...
@Basic(optional=true)
@Column(name="CUB_ID",nullable=true)
String cubicle;
...
}
@Entity
public class Department {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
...
@OneToMany(mappedBy="department")
@MapKeyColumn(name="CUB_ID",nullable=true)
private Map<String, Employee> employeesByCubicle;
...
}
MYSQL中的数据:
EDIT2
我开始认为我试图做的事情可能无法实现;如果是在Department中给定Map<String,Employee>
,则JPA将转到Employee表并检索给定部门的所有雇员,然后为每个雇员提取隔间,然后尝试将条目放入用k=cubicleid
,v=employee
来映射,那么也许没有办法告诉JPA,如果cubicleid为null,则不要尝试将条目放入映射中。
这种想法是对还是错? TIA。