4

1 つのシナリオがあります。

@Entity
@Table(name = "someTable")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Access(AccessType.FIELD)
@DiscriminatorColumn(name = "someDisc")
public abstract class AbstractClass{}

@Entity
@Access(AccessType.FIELD)
@DiscriminatorValue("1")
public class Child1 extends AbstractClass{
}

@Entity
@Access(AccessType.FIELD)
@DiscriminatorValue("2")
public class Child2 extends AbstractClass{
}

3番目のテーブルでは、このようなものが必要です

@Entity
@Table
public class ThridTable{

    @OneToMany(cascade = CascadeType.ALL, fetch = EAGER, orphanRemoval = true)
    @JoinColumn(name = "foreinKeyCol", nullable = false)
    @OrderColumn(name = "orderCol")
    private List<Child2> child2 = new ArrayList<>();


    @OneToMany(cascade = CascadeType.ALL, fetch = EAGER, orphanRemoval = true)
    @JoinColumn(name = "foreinKeyCol", nullable = false)
    @OrderColumn(name = "orderCol")
    private List<Child1> child1 = new ArrayList<>();

//more setters/getters
}

今はうまく持続し、値がテーブルに正しく保存されています。ThridTable オブジェクトを使用してオブジェクトをフェッチしているときに直面する問題。生成されたクエリは、同じテーブル内の child1 と child2 という 2 つのインスタンスを区別せず、子インスタンス内の child2 のオブジェクトを更新しようとします。

4

1 に答える 1

6

休止状態を使用している場合は、マッピングに@Where条件を追加できます。@OneToMany

例えば:

@OneToMany(cascade = CascadeType.ALL, fetch = EAGER, orphanRemoval = true)
@JoinColumn(name = "foreinKeyCol", nullable = false)
@OrderColumn(name = "orderCol")
@Where(clause="someDisc=1")
private List<Child1> child1 = new ArrayList<>();

API を見てください: http://docs.jboss.org/hibernate/core/4.1/javadocs/org/hibernate/annotations/Where.html

および: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-hibspec-collection

于 2012-12-20T13:37:37.257 に答える