2012-04-27 15 views
2

双方向マッピングについていくつか質問があります。 - (1)Parking_Lot JPAリレーションシップマッピングの概念

  • 従業員(*) - (1)部門
  • 従業員(*) - (1)プロジェクト

    1. 従業員(1):

      私はこれらのエンティティを持っています
    2. 上記の関係のソースおよびターゲットエンティティは何ですか?

    3. ManyToOne関係のオーナーはどのようなものですか?多くのエンティティまたは1つのエンティティでオーナーが であるのだろうか?
    4. mappedByはオーナー側か反対側で指定しますか?

    助けてください。

    EDIT:

    I持って、次の表: プロジェクト - Proj_Client - クライアント(多くの関係に多くの)とプロジェクトテーブルを保持しかし、クライアントが持続取得されていません。何が間違っていますか?

    ありがとうございました。

  • 答えて

    8
    @Entity 
    @Table(name="empoyee") 
    public class Employee { 
        @Id 
        @GeneratedValue(strategy = GenerationType.IDENTITY) 
        @Column(name = "id") 
        private Integer id; 
        @ManyToOne 
        @JoinColumn(name="department_id", referencedColumnName="id") 
        private Department department; 
        @ManyToOne 
        @JoinColumn(name="project_id", referencedColumnName="id") 
        private Project projects; 
        @OneToOne(mappedBy="employee") 
        private ParkingLot parkingLot; 
        //Other properties,constructors, getters and setters and so on 
    } 
    
    @Entity 
    @Table(name="department") 
    public class Department implements Serializable { 
        @Id 
        @GeneratedValue(strategy = GenerationType.IDENTITY) 
        @Column(name = "id") 
        private Long id; 
        @OneToMany(mappedBy="department") 
        private List<Employee> employees; 
        //Other properties,constructors, getters and setters and so on} 
    @Entity 
    @Table(name="parking_lot") 
    public class ParkingLot implements Serializable { 
        @Id 
        @GeneratedValue(strategy = GenerationType.IDENTITY) 
        @Column(name = "id") 
        private Long id; 
        @OneToOne 
        @JoinColumn(name="employee_id",referencedColumnName="id") 
        private Employee employee; 
        //Other properties,constructors, getters and setters and so on} 
    @Entity 
    @Table(name="project") 
    public class Project implements Serializable { 
        @Id 
        @GeneratedValue(strategy = GenerationType.IDENTITY) 
        @Column(name = "id") 
        private Long id; 
        @OneToMany(mappedBy="project") 
        private List<Employee> employees; 
        //Other properties,constructors, getters and setters and so on 
    } 
    

    リレーションシップが単方向である場合、実際に所有サイドはなく、mappedByアノテーションはありません。 リレーションシップが双方向である場合、mappedByアノテーション付きのサイドがあります。もう一方は所有側です。 所有側は関係を所有する側です。したがって、この用語は、ParkingLotが従業員を所有しているか、従業員がそのParkingLotを所有しているように適用されるのではなく、ParkingLotと従業員の関係がEmployee(またはParkingLotは下記参照)の所有と同様です。 ManyToOneにはmappedByがありません。したがって、関係を所有するOneToManyアノテーションの下で常に指定されたエンティティです(たとえば、プロジェクトテーブルはすべての従業員に外部キーを持つことができないため) したがって、例のManyToOne/OneToManyマッピングでは、どちらの側が関係を所有しているかを選択する必要はありません。従業員と駐車場の間に選択肢があります。私はParkingLotを選択しました。 選択肢が与えられると、それは何が重要ですか?まあ、主な違いは、mappedByには偽のカスケードがあることです。どちらのテーブルに外部キーがあるかどうか、またはその関係が独自のテーブルにある場合はJPAはすべてのケース(@InverseJoinColumnなど)をサポートしています。

    双方向マッピングの場合、マッピングの明確なターゲットとソースがないため、マッピングの方法によって異なります。この用語は単方向マッピングに適用され、ソース側はもちろんマッピングを持つエンティティです(ターゲットエンティティの可能な知識です)

    4)該当しません(ただし、ParkingLotとEmployee単方向)。 5)関係の所有者が「ワンエンティティに」常に 6)逆側

    最後の注意: は部門が従業員を所有している場合ように、例えば、我々が設計でき、混乱して「側を所有しています」私たちは部門を削除し、従業員全員も削除されます。これは、@OneToMany(mappedBy="department")@OneToMany(mappedBy="department", cascade= CascadeType.REMOVE)に変更することによって行われます。「DepartmentエンティティがEmployeeエンティティを所有しています」と言うのは本当に意味がありますが、その関係は従業員エンティティが所有しています。

    +0

    JPAがマッピング(リンク)操作を実行するが、プロバイダがSQL操作を実行するため、所有サイドが混乱します。質問:私は、Employeeとプロジェクトの間に多対多の関係があり、joinTableのようなすべての必要なマッピングがあります。テーブルクラス/エンティティを結合する。この場合、joinTableをどのように設定するのですか? – peterwkc

    +0

    カスケードは、所有者関係またはJPAマッピングとSQL操作にどのような影響を及ぼしますか? – peterwkc

    +0

    追加のデータ/列ではなく、関係のみを保持する限り、JoinTableのための別個のクラス/エンティティは必要ありません。カスケード質問:http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Cascading – esej