1

Department と Employee の間に 1-m の関係があり、その部署には多くの従業員がいて、1 人の従業員は 1 つの部署にしか所属できないとします。Employee テーブルに depId を外部キーとして持っています。以下は、エンティティがセッターとゲッターでどのように見えるかです。

@Entity
public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long empId;
    private String name;

    @ManyToOne
    @JoinColumn(name = "deptId")
    private Department dept;

    public Long getEmpId() {
        return empId;
    }
}



@Entity
public class Department {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long deptId;
    private String name;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "deptId")
    @IndexColumn(name = "idx")
    private Set<Employee> listEmp;
}

以前の部門には属性 mapsBy があり、両方のエンティティに joinColumn があり、両方のエンティティが関係の所有者ですよね?

私の疑問は、最初に部門を作成してから、一連の従業員を作成し、作成した部門を設定して、正常に機能する部門オブジェクトを保存することです。しかし、次に、部門を作成して従業員を作成し、そこに部門を設定して、例外の下にある従業員オブジェクトを保存しようとしました。

Hibernate: Employee (deptId, name) の値 (?, ?) に挿入 スレッド "main" org.hibernate.TransientObjectException で例外: オブジェクトが未保存の一時インスタンスを参照 - フラッシュする前に一時インスタンスを保存: hello.domain.Department

両方の方法で機能するべきではありませんか?

4

2 に答える 2

4

以前の部門には属性 mapsBy があり、両方のエンティティに joinColumn があり、両方のエンティティが関係の所有者ですよね?

違う。OneToMany の双方向の関連付けではなく、Hibernate が同じ列を使用してマップしようとする 2 つの異なる単方向の関連付けがあり、予期しない動作が発生します。

mappedBy一方の属性を使用する必要があります。

于 2012-12-23T16:19:22.850 に答える
0

http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/から:

2.2.5.3.1.1. 双方向

多対 1 は (ほぼ) 常に JPA 仕様の双方向関係の所有者側であるため、1 対多の関連付けは @OneToMany(mappedBy=...) によって注釈が付けられます。

次に例を示します。

Troop は、troop プロパティを通じて Soldier と双方向の 1 対多の関係を持ちます。MappedBy 側で物理マッピングを定義する必要はありません (定義してはなりません)。

1 対多側を所有側として、双方向の 1 対多をマップするには、mappedBy 要素を削除し、多対 1 の @JoinColumn を挿入可能および更新可能として false に設定する必要があります。

「所有」側は常に 1 つだけであることに注意してください。

于 2012-12-23T16:22:54.293 に答える