首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于持久化具有关系的元素的问题

关于持久化具有关系的元素的问题
EN

Stack Overflow用户
提问于 2011-09-21 13:31:09
回答 1查看 199关注 0票数 0

我通常会看到使用JPA在网上持久化的实体的例子,但它只涉及一个实体。但是我不能让我自己理解其中是否涉及到关系。

举个例子,我在教授和系之间有一个多对一的映射。

代码语言:javascript
复制
@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中,您通常会在添加新教授时显示部门的下拉框。

代码语言:javascript
复制
<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。

代码语言:javascript
复制
@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();
    }
}

为了清楚起见,我只是在这里展示了我的业务服务。

代码语言:javascript
复制
public class BusinessService {
  protected EntityManager em;

  public Professor createProfessor(Professor prof) {
    em.persist(prof);
    return prof;
  }
}

网上的许多例子都是这样的粗略例子:

代码语言:javascript
复制
Department dept = new Department();
dept.setId(1);
dept.setName("Finance");
Prof newProf = new Professor();
newProf.setDepartment(dept);
service.createProfessor(newProf);

但我认为这不是在web应用程序中呈现和收集数据的方式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-21 16:00:13

您需要一个已加载的Department实体对象(或对其代理的引用)才能将其链接到教授。仅仅拥有Department名称并不能为您提供对entity对象的引用。

请查看来自Hibernate documentation, Chapter 3: 3.3. Loading an object的参考资料

您可以使用以下命令加载对象状态:

代码语言:javascript
复制
dept = em.find(Department.class, deptId);

或者只是获取对它的引用:

代码语言:javascript
复制
dept = em.getReference(Department.class, deptId);  // no db hit

但是,如果您想要将Department对象(或其代理引用)链接到教授,则确实需要检索该对象。Hibernate管理整个对象状态,它与其他实体的链接,所以不可能只使用name来将教授链接到系。

如果您没有id,只有部门的名称,那么您需要像在代码中那样做(通过名称查询部门)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7495007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档