1

LegacyOracle-DatabaseをHibernateにマップしようとするといくつか問題が発生します。具体的には、正しい継承マッピングを機能させることができません。私が取り組んできた例は、Person-Employee-Relationshipです。私たちのデータベースでは、テーブルが分離されているため、マッピング戦略のみが結合されます。ここで問題となるのは、EmployeeのPKがEmployeeIdとCompanyIdで構成され、PersonIdが通常のFKであるということです。そして、現在実行中のシステムを台無しにすることなく、それを変更する方法はありません。
PersonとEmployeeの現在のコードは次のとおりです。

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
}

すでに機能しているもの:新しい従業員または人の作成または削除機能していないもの:既存の従業員または人を選択しても、例外が発生しないか、何かが何も返さない。

継承階層にない別のエンティティでは完全に機能するため、継承と関係がある必要があります。

ヒント/アイデア/回避策はありますか、それとも私は失敗していますか?
すべてをいただければ幸いです。
前もって感謝します。

編集:どうやら、従業員の作成または削除は、どちらかがより理にかなっているようになりました。「内部表現への変換に失敗しました」というメッセージが表示されます。

4

1 に答える 1

1

これは実に悩ましい問題です!

解決策の 1 つは、従業員と個人の関係を継承としてモデル化しないことです。主キーの違いは、それに対して反論します。

代わりに、従業員に人がいる構成としてモデル化できます。Employees と People をより均一に処理できるようにする場合は、次のようなインターフェイスを定義できます。

public interface Individual {
    public Person self();
}

Person による実装の場合:

    public Person self() {
        return this;
    }

そして従業員:

    public Person self() {
        return person;
    }

これは少し奇妙ですが。

于 2012-11-27T14:11:52.027 に答える