【问题标题】:Questions on persisting elements with relations关于具有关系的持久元素的问题
【发布时间】:2011-09-21 05:31:09
【问题描述】:

我经常看到使用 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 应用程序中呈现和收集的方式。

【问题讨论】:

    标签: hibernate jsf-2 jpa-2.0


    【解决方案1】:

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

    看看这个来自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 对象(或其代理引用)链接到 Professor,您确实需要检索 Department 对象(或其代理引用)。 Hibernate 管理整个对象状态,它与其他实体的链接,因此不可能只使用名​​称来将教授链接到部门。

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

    【讨论】:

    • 嗨,我实际上并没有坚持部门,因为它已经注册了。我只是想知道我是否需要先从 DB 中检索部门,然后将其设置为我的教授类。感谢您的回复。
    • 如果你已经有一个分离的实体对象Department,你可以将Department设置为Professor,并将其合并到Persistence Context中。我将在今晚晚些时候编辑我的答案以澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 2022-01-08
    • 2020-02-23
    • 1970-01-01
    • 2012-12-17
    • 2014-10-30
    • 1970-01-01
    相关资源
    最近更新 更多