2

双方向マッピングについていくつか質問があります。

私はこれらのエンティティを持っています:

  1. 従業員(1) - (1) 駐車場
  2. 従業員(*) - (1) 部署
  3. 従業員(*) - (1) プロジェクト

  4. 上記の関係のソース エンティティとターゲット エンティティは何ですか?

  5. 関係の所有者は何ですかManyToOne。所有者が複数のエンティティまたは単一のエンティティにいるのだろうか?
  6. mappedBy所有者側または反対側のどちらで指定しますか?

助けてください。

編集:

次のテーブルがあります: プロジェクト- Proj_Client -クライアント(多対多の関係) で、プロジェクト テーブルを永続化しますが、クライアントは永続化されません。それの何が問題なのですか?

ありがとう。

4

1 に答える 1

7
@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 がその従業員を所有している、または Employee がその ParkingLot を所有しているように適用されるのではなく、ParkingLot と Employee の関係が従業員によって所有されているように適用されます (または、以下の ParkingLot を参照)。ManyToOne の場合、mappedBy は存在しないため、関係を所有するのは常に OneToMany アノテーションで指定されたエンティティです (たとえば、プロジェクト テーブルはすべての従業員への外部キーを持つことができないため、意味があります)。あなたの例ではOneToManyマッピングはありません どちらの側が関係を所有するかを選択することはできません。従業員と駐車場の間で選択肢があり、私は駐車場を選びました。選択肢が与えられたとき、それは何を意味しますか? 主な違いは、mappedBy にはプロパティ カスケードがあることです。どのテーブルが外部キーを持っているか、またはリレーションシップが独自のテーブルにあるかどうかは問題ではないことに注意してください - JPA はすべてのケース (@InverseJoinColumn など) をサポートします。

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

4) 該当なし (ParkingLot と Employee の関係を一方向にしない限り)。5) 関係の所有者は常に「1 つの実体上」にある 6) 逆側

最後の注意: 「所有側」は紛らわしいです。たとえば、部門が従業員を所有するように設計でき、部門を削除すると、その従業員もすべて削除されます。これは、「Department エンティティがその Employee エンティティを所有している」と言うのは理にかなっていますが、リレーションシップは引き続き Employee エンティティによって所有されます@OneToMany(mappedBy="department")@OneToMany(mappedBy="department", cascade= CascadeType.REMOVE)

于 2012-04-29T08:05:28.317 に答える