2017-04-04 18 views
1

私は、従業員のリストでXMLファイルを受け取り、親子/従業員マネージャの関係を単一のデータベーステーブルに格納するアプリケーションを構築しようとしています。親子関係 - 自己結合マッピング

私のXMLファイルには、この1のようになります。

<Employees> 
    <Employee manager="Patrick">Martin</Employee> 
    <Employee manager="Patrick">Kent</Employee> 
    <Employee manager="Martin">Mark</Employee> 
    <Employee>Hugo</Employee> <!-- root element of the employee-manager tree --> 
    <Employee manager="Hugo">Osa</Employee> 
    <Employee manager="Osa">Patrick</Employee> 
</Employee> 

一つの従業員は、唯一のマネージャーを持つことができますが、1つのマネージャは、複数の部下/従業員を持つことができます。

受信したXMLファイルをアンマーシャリングするときに問題はありませんが、データベースにアンマーシャリングされた値を格納できる適切なモデルを作成しようとしています。データは、「従業員」という名前のテーブルに格納する必要があり、以下のデータが含まれている必要があります。

------------------------------ 
| id   | Integer | 
------------------------------ 
| employee_name | String  | 
------------------------------ 
| parent_id  | Integer | -- reference to the manager 
------------------------------ 

私は Employeeという名前の新しいクラスを作成しましたが、私は適切なManyToOne/OneToMany注釈を定義するかどうかはわかりません。

私はこれにかなり新しいので、いくつかの例とチュートリアル(同様にスタックオーバーフローに関する同様の質問の回答も)をGoogleで探そうとしましたが、私はこの点で大きなミスを犯していると思いますこのモデルを定義する際の実装。

public class Employee { 
    @Id 
    @GeneratedValue 
    private int id; 

    @Column(name = "parent_id") 
    @Transient 
    @ManyToOne(cascade={CascadeType.ALL}) 
    private String managerName; 

    @Column(name = "employee_name") 
    @JoinColumn(name="parent_id") 
    private String employeeName; 

    // getters and setters 

誰もが適切なモデルを定義する方向に私を指すことができれば、それははるかになり、感謝:私の最新の試みは、このようになります! Hibernate

答えて

1

はあなたがエンティティだけでなく、プロパティの間にマップManyToOne関係をマップするとき、あなたはタイプEmployeeのオブジェクトを参照する必要はないだけStringまたはid

問題:

  • だからあなたのマッピングが間違っていると、多くのマッピングエラーがスローされます、代わりに書き込みの :

    @Column(name = "parent_id") 
    @Transient 
    @ManyToOne(cascade={CascadeType.ALL}) 
    private String managerName; 
    

    あなたはこのようManyToOne realtionshipをマップする必要があります。

    @ManyToOne(cascade={CascadeType.ALL}) 
    @JoinColumn(name="manager_id") 
    private Employee manager; 
    
  • そして、あなたはこのような関係の反対側をマッピングしていることを確認します

    @OneToMany(mappedBy="manager") 
    private Set<Employee> subordinates = new HashSet<Employee>(); 
    
  • また列employee_nameのためのあなたのマッピングが間違っている、 @JoinColumnは関係のためにのみ使用され、一緒に使用することはできません 単純な列、あなたはこのようにそれを記述する必要があります。私たちはattributを使用したい場合は @Transientはあなたのマッピングでは役に立たない

    @Column(name = "employee_name") 
    private String employeeName; 
    
  • が、我々はそれだけを使いますeはデータベースに保持されません。

  • そして最も重要なあなたが@Entityとあなたのクラスをマッピングし、それは ことができることを確認し、データベースに永続化。

例:

あなたはそれはあなたが実装する同じモデルを使用していますHibernate Self Join Annotations One To Many mapping example確認することができます。

あなたは単にあなたのEmployeeテーブルにManyToOne関係を持っている必要があり
+0

ありがとう、chsdk。あなたが提案した方法でソリューションを実装しようとします。私はそれを作ることができますように願っています。 – hezus

+0

@hezusあなたは歓迎です、私はそれがあなたに期待される結果を与えると確信しています。 –

-1

、つまり複数の従業員は(もある従業員)同じマネージャを持つことができ、管理者のために、このフィールドは、このように、空のままになります:

@Entity 
@Table(name = "EMPLOYEE") 
public class Employee { 

    @Id 
    @GeneratedValue 
    private int id; 

    @ManyToOne 
    private Employee manager; 

    @Column(name = "employee_name") 
    private String employeeName;