2012-11-27 28 views
1

我在嘗試將遺留Oracle數據庫映射到Hibernate時出現了一些問題。更具體地說,我不能得到一個正確的繼承 - 映射工作。我一直在使用的示例是Person-Employee-Relationship。在我們的數據庫中,表格是獨立的,所以唯一的映射策略將被加入。現在問題是Employee的PK由EmployeeId和CompanyId組成,PersonId只是普通的FK。如果不改變當前運行的系統,就無法改變這種狀況。
這裏是人與員工當前代碼:Hibernate:繼承映射到傳統數據庫

Person.class

@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:

@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 
} 

什麼已經工作:創建或刪除一個新的僱員或人 不起作用的是:選擇已經存在的員工或人員,我沒有得到任何異常或者什麼都不返回。

它必須與繼承有關,因爲與不在繼承層次結構中的另一個實體完美地工作。

任何提示/想法/解決方法或我擰?
Everthing將不勝感激。
在此先感謝。

編輯:顯然創建或刪除員工現在不工作,或者哪種更有意義。我得到「未能轉換爲內部表示」。

+0

沒有人有想法嗎?或者至少可以告訴我,這肯定不會起作用?我真的很感激。 –

回答

1

這確實是一個令人討厭的問題!

一個解決方案是不將員工 - 人員關係建模爲繼承。他們的主鍵的區別與此相反。

相反,您可以將其建模爲組合,其中員工爲has a人。如果您希望能夠更均勻地處理與員工的關係和人,那麼你可以這樣定義一個接口:

public interface Individual { 
    public Person self(); 
} 

有了實現的人:

public Person self() { 
     return this; 
    } 

和員工:

public Person self() { 
     return person; 
    } 

雖然這會有點奇怪。

+0

是的,當然,像界面或onetoone關係的東西是可能的,我已經嘗試過了,但功能的繼承會更容易。數據庫已經非常混亂,我真的希望保持儘可能簡單。也許別人有想法? –

+0

我希望如此。我最初寫道,你想要的東西是不可能的,但'@ PrimaryKeyJoinColumn'的文檔表明它是。我會和你一樣感興趣,看到一個合適的解決方案! –