2011-09-30 4 views
0

ORM (장기 수명 프로젝트보기)에서 관계를 사용하는 가장 좋은/일반적인 솔루션 (모범 사례)은 무엇입니까?ORM에서의 관계 작업

1) 예 : Oracle HR 스키마가 있습니다. 가능한 모든 객체 (엔티티) 사이의 관계를 만들거나 지금 실제로 필요로하는 (그리고 미래에 변경되는) 객체 사이의 관계 만 만들 수 있습니까?

@Entity 
public class Employee { 
    @Id 
    private long employeeId; 
    @ManyToOne((fetch = FetchType.LAZY) 
    private Job job; 
} 

@Entity 
public class Job { 
    @Id 
    private String jobId; 
    @OneToMany(fetch = FetchType.LAZY) 
    private List<Employee> employeeList; 
} 

2) 기존 또는 새로운 작업으로 새로운 직원을 어떻게 저장해야합니까?

@Entity 
public class Employee { 
    @Id 
    private long employeeId; 
    private String jobId; 
    @ManyToOne((fetch = FetchType.LAZY) 
    private Job job; 
} 

마다 두 매개 변수 설정 최악의 솔루션 :

Job job = new Job(); 
job.setJobId("JOB_01"); 
Employee employee = new Employee(); 
employee.setEmployeeId(1L) 
employee.setJobId(job.getJobId()); 

조금 더 나은 솔루션입니다 재 구현 setJobId()을 우리는 문자열 작업 ID와 직원 엔티티와도 생성 관련 작업 작업 변수가 당신이 연결을 필요로하지 않는 경우

public void setJobId(String jobId) { 
    if (getJob() == null) { 
     this.jobId = jobId; 
     job = new Job(); 
     job.setJobId(jobId); 
    } else { 
     this.jobId = getJob().getJobId(); 
    } 
} 

답변

1

하면, 당신은 추가 할 필요가 없습니다 : Employee 클래스의 메소드 (일부 언급 한 작업이 존재 여부를 확인하는 코드 여부를이 있어야한다) 그것. 그러나 Java 코드에서 직접 사용되지 않더라도 JPQL 또는 조건 쿼리에서이를 추적 할 수있는 관계가 여전히 유용 할 수 있습니다.

jobId 입력란은 Employee 엔티티에서만 삭제해야합니다. 직원은 직업이 있으며 employee.getJob().getId()을 사용하여 해당 직업 ID에 액세스 할 수 있습니다. 직원의 작업 ID를 설정할 수 없어야합니다. 대신 (서비스 계층에서) 작업을 가져 오거나 작성해야하며 setJob(job)을 사용하여 직원의 작업을 설정해야합니다.

+0

답변을 주셔서 감사합니다. – Ziletka

+0

그리고 새로운 직원을 기존 작업과 함께 저장하는 좋은 해결책이 있습니까? 왜냐하면 job.setJobId ("AC_ACCOUNT")와 employee.setJob (job)을 호출 할 때 시스템은 새로운 작업을 저장하거나 기존 작업을 업데이트하려고 시도하기 때문입니다. – Ziletka

+1

데이터베이스 (em.find 또는 em.getReference 또는 session.get 또는 session.load)를 사용하여 주어진 ID로 작업을 가져 와서이 작업을 직원에게 설정하십시오. –