2011-09-21 3 views
0

일반적으로 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 페이지에 .. 난 보통 내 폼 요소 내 관리 빈 사이에 매핑을 추가합니다.
추가 작업 중에 웹 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}" /> 

자, 내 질문은 : 먼저 부서를 얻을 그것을 지속하기 전에 내 현재 교수의 속성을 설정하기위한 요구 사항인가? 이 때문에 내 경우에는, 난 이미 난 그냥 명확성을 위해 여기에 내 비즈니스 서비스를 보여 부서 아이디 ..

@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); 

하지만이 데이터 제시와 웹 응용 프로그램에서 수집되지 방법이라고 생각합니다.

답변

1

로드 된 Department 엔티티 개체 (또는 프록시에 대한 참조)가 있어야 교수와 연결할 수 있습니다. 부서 이름을 지정하는 것만 엔티티 개체에 대한 참조를 제공하지 않습니다. 당신이 객체 상태를로드 할 수 있습니다

:

dept = em.find(Department.class, deptId); 

또는 단지에 대한 참조를 얻을 다음 Hibernate documentation, Chapter 3: 3.3. Loading an object에서이 기준에

봐 네 그러나

dept = em.getReference(Department.class, deptId); // no db hit 

을, Profiler에 연결하려는 경우 Department 객체 (또는 프록시 참조)를 검색해야합니다. Hibernate는 전체 객체 상태, 다른 엔티티에 대한 그것의 링크를 관리한다. 그래서 당신은 교수를 부서에 연결할 때 이름을 사용할 수 없다.

부서의 이름 인 ID가없는 경우 코드에서 수행 한 것처럼 수행해야합니다 (이름을 통해 부서에 대한 쿼리).

+0

안녕하세요, 저는 이미 등록 된 부서를 그대로 유지하고 있지 않습니다. 방금 DB에서 Department를 가져와야한다면 내 Professor Class로 설정해야합니다. 답장을 보내 주셔서 감사합니다. –

+0

이미 분리 된 엔티티 개체 부서가있는 경우 Department를 Professor로 설정하고 Persistence Context로 병합하면됩니다. 나는 오늘 저녁에 내 대답을 편집하여 명확히 할 것이다. – sayYeah