1

私はクラスPersonを持っています。クラス階層にInheritanceType.TABLE_PER_CLASSを使用すると3つのクラスを持つクラス階層があります。バッチ更新 "問題。下記のコードをご覧ください。 AbstractBaseは、クラス階層の基本クラスです。Hibernateで単方向の1対多およびテーブルPer InheritanceTypeを使用するときの問題

public class Person { 
    @Id 
    @GeneratedValue(generator = "uuid") 
    @GenericGenerator(name = "uuid", strategy = "uuid2") 
    private String id; 

    @OneToMany 
    @JoinColumn(name="Employee_employees_Person", referencedColumnName = "id") 
    @Cascade({org.hibernate.annotations.CascadeType.PERSIST, org.hibernate.annotations.CascadeType.MERGE}) 
    private Set<Employee> employees = new HashSet<>(); 
} 

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
@javax.persistence.Access(javax.persistence.AccessType.FIELD) 
public abstract class AbstractBase { 
@Id 
@GeneratedValue(generator = "uuid") 
@GenericGenerator(name = "uuid", strategy = "uuid2") 
private String id; 

public String getId() { 
    return id; 
} 
public void setId(String id) { 
    this.id = id; 
}  
} 

@Entity 
@Table(name = "EmployeeClass") 
@javax.persistence.Access(javax.persistence.AccessType.FIELD) 
public class Employee extends AbstractBase implements Serializable { 
    private String name; 
    @Column(name="Employee_employees_Person") 
    private String Employee_employees_Person_ID; 
} 

@Entity 
public class Manager extends Employee { 
    @Property(name="ManagerLevel") 
    @Column(name="ManagerLevel") 
    private String level; 

    public String getLevel() { 
     return level; 
    } 

    public void setLevel(String level) { 
    this.level = level; 
    } 
} 

テストコード:

em.getTransaction().begin(); 
Person a = new Person(); 
Employee e1 = new Employee(); 
e1.setName("Bill"); 

Manager m1 = new Manager(); 
m1.setName("Amanda"); 
m1.setLevel("VP"); 
a.getEmployees().add(e1); 
a.getEmployees().add(m1); 
em.persist(a); 
em.getTransaction().commit(); 

出力:

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1"

私はHibernateのSQLを介して行ったとき、HibernateはManagerテーブルを更新しないことがわかりました。 InheritanceTypeをInheritanceType.JOINEDに変更すると、コードはうまく動作します。単方向の1対多の構成で何かを逃していますか?

----------------------------------アップデート------------------- ---------------------

「Person」クラスでは、@ JoinColumnを@JoinTableに変更しました.1対多のアノテーションでテストコードが動作しますよくターゲットクラスに "InheritanceType.TABLE_PER_CLASS"というアノテーションが付けられている場合、@JoinColumn設定の設定が失われていますか? ----------------------------------

@OneToMany 
//@JoinColumn(name="Employee_employees_Person", referencedColumnName = "id") 
@JoinTable (
     name = "Person_employees_Employee", 
     joinColumns={ @JoinColumn(name="Person_ID", referencedColumnName="id") }, 
     inverseJoinColumns={ @JoinColumn(name="Employee_ID", referencedColumnName="id", unique=true)} 
) 
@Cascade({org.hibernate.annotations.CascadeType.PERSIST, org.hibernate.annotations.CascadeType.MERGE}) 
private Set<Employee> employees = new HashSet<>(); 

は、以下の詳細な注釈を参照してください。 ---更新--------------------------------

私はHibernate 5.2.5でコードを試しました。 、問題は依然として存在します。

答えて

0

多分HHH-9864に関連しています。 Hibernate 5.2.5を試して、よりうまく動作するかどうかを確認してください。

+0

Vlad、あなたの情報に感謝します。私はHibernate 5.2.5 finalで試しましたが、問題はまだ存在します –

関連する問題