2012-11-27 3 views
1

레거시 Oracle 데이터베이스를 최대 절전 모드로 매핑하는 데 문제가 있습니다. 좀 더 구체적으로 말하면 올바른 상속 매핑을 사용할 수 없습니다. 내가 함께 해왔 던 예제는 Person-Employee-Relationship입니다. 우리의 데이터베이스에서 테이블은 분리되어 있으므로 유일한 매핑 전략이 합류하게됩니다. 이제 문제는 Employee의 PK는 EmployeeId와 CompanyId로 구성되며 PersonId는 일반 FK만으로 구성됩니다. 현재 실행중인 시스템을 망쳐 놓지 않고도이를 변경할 방법이 없습니다.최대 절전 모드 : 레거시 데이터베이스 상속 매핑

@Entity 
@Table (name = "personas") 
@Inheritance (strategy = InheritanceType.JOINED) 
public class Person { 
    private String personId; 
    private boolean physical; 
    private String name; 
    private String fantasyName; 
    private char gender; 

    @Id 
    @Column (name = "cod_persona") 
    public String getPersonId() { 
     return personId; 
} 

    public void setPersonId(String personId) { 
     this.personId = personId; 
    } 

    //rest of setters and getters 
} 

Employee.class

Person.class : 새로운 직원 또는 사람 을 만들거나 삭제 : 이미 작동 무엇

@Entity 
@Table (name = "rh_empleados") 
@PrimaryKeyJoinColumn (name = "cod_persona") 
public class Employee extends Person { 
    private Company company; 
    private String employeeId; 
    private Integer finalSalary; 
    private Branch branch; 

    @Basic (optional = false) 
    @ManyToOne 
    @JoinColumn (name = "cod_empresa") 
    public Company getCompany() { 
     return company; 
    } 

    public void setCompany(Company company) { 
     this.company = company; 
    } 

    @Basic (optional = false) 
    @Column (name = "cod_empleado") 
    public String getEmployeeId() { 
     return employeeId; 
} 

    public void setEmployeeId(String employeeId) { 
     this.employeeId = employeeId; 
    } 

    //rest of setters and getters 
} 


여기 은 사람과 직원에 대한 현재 코드 효과가없는 것 : 기존 직원이나 사람을 선택하면 예외가 발생하지 않거나 아무 것도 반환되지 않습니다.

상속 계층 구조에없는 다른 엔터티가 완벽하게 작동하기 때문에 상속 관계가 있어야합니다.

팁/아이디어/해결 방법이 있습니까?
아무 것도 인정하지 않을 것입니다.
미리 감사드립니다.

편집 : 분명히 직원을 만들거나 삭제하면 현재 더 효과적이지 않습니다. 나는 "내부 표현으로 변환하지 못함"을 얻는다.

+0

아무도 아이디어가 없습니까? 아니면 분명히 확실히 작동하지 않을 것이라고 말할 수 있습니까? 나는 정말로 감사 할 것입니다. –

답변

1

이것은 실제로 성가신 문제입니다.

한 가지 해결책은 Employee-Person 관계를 상속으로 모델링하지 않는 것입니다. 그들의 기본 키의 차이점은 그것을 반대합니다.

직원 대신 구성 할 수 있습니다. 여기서 직원은 has a입니다.

public Person self() { 
     return this; 
    } 

그리고 직원 : 사람에 의해 구현으로

public interface Individual { 
    public Person self(); 
} 

: 당신이보다 균일 임직원 사람들을 처리 할 수있게하려면, 다음과 같은 인터페이스를 정의 할 수

public Person self() { 
     return person; 
    } 

조금 이상하지만.

+0

그래, 인터페이스 또는 onetoone 관계 같은 것이 가능할 것이라고 확신한다. 나는 이미 그걸 가지고 시험해 보았지만, 상속 기능은 훨씬 쉬울 것이다. 데이터베이스는 이미 꽤 혼란스럽고 가능한 한 간단하게 유지하려고합니다. 어쩌면 다른 누군가가 아이디어를 가지고 있을까요? –

+0

나는 그렇게 희망한다. 나는 처음에 당신이 원했던 것은 불가능하다고 썼다. 그러나'@ PrimaryKeyJoinColumn'을위한 문서는 그것이 그렇다는 것을 암시한다. 나는 당신이 적당한 해결책을보기 위하여 흥미있을 것입니다! –