我通常会看到使用JPA在网上持久化的实体的例子,但它只涉及一个实体。但是我不能让我自己理解其中是否涉及到关系。
举个例子,我在教授和系之间有一个多对一的映射。
@Entity
public class Professor {
@ManyToOne
@JoinColumn(name="DEPT_ID")
private Department department;
}
@Entity
public class Department {
//normal getters and setters
private int id;
private String name;
}现在,在我的JSF页面中..我通常在表单元素和托管bean之间添加映射。
在添加操作期间,在web UI中,您通常会在添加新教授时显示部门的下拉框。
<h:inputText value="#{myBean.currentProf.name}"/>
.
. /* other mappings here */
.
<h:selectOneMenu value="#{myBean.currentProf.department.name}>
<f:selectItems value="#{myBean.allDepartments}"/>
</h:selectOneMenu>
<h:commandButton value="Add" actionListener="#{myBean.handleSave}" />现在,我的问题是:是否需要先获取系,然后将其设置为我当前的教授属性,然后再持久化它?因为在我的例子中,我已经设置了部门名称,但没有设置部门Id。
@ManagedBean
public class MyBean{
public Professor currentProf;
public BusinessService service;
public String handleSave(){
Department dept = service.findDepartment(currentProf.getDepartment().getName());
currentProf.setDepartment(dept);
service.createProfessor(currentProf);
}
public List<SelectItem> getAllDepartments(){
return service.getAllDepartments();
}
}为了清楚起见,我只是在这里展示了我的业务服务。
public class BusinessService {
protected EntityManager em;
public Professor createProfessor(Professor prof) {
em.persist(prof);
return prof;
}
}网上的许多例子都是这样的粗略例子:
Department dept = new Department();
dept.setId(1);
dept.setName("Finance");
Prof newProf = new Professor();
newProf.setDepartment(dept);
service.createProfessor(newProf);但我认为这不是在web应用程序中呈现和收集数据的方式。
发布于 2011-09-21 16:00:13
您需要一个已加载的Department实体对象(或对其代理的引用)才能将其链接到教授。仅仅拥有Department名称并不能为您提供对entity对象的引用。
请查看来自Hibernate documentation, Chapter 3: 3.3. Loading an object的参考资料
您可以使用以下命令加载对象状态:
dept = em.find(Department.class, deptId);或者只是获取对它的引用:
dept = em.getReference(Department.class, deptId); // no db hit但是,如果您想要将Department对象(或其代理引用)链接到教授,则确实需要检索该对象。Hibernate管理整个对象状态,它与其他实体的链接,所以不可能只使用name来将教授链接到系。
如果您没有id,只有部门的名称,那么您需要像在代码中那样做(通过名称查询部门)。
https://stackoverflow.com/questions/7495007
复制相似问题