1

У меня есть класс Person и иерархия классов, которая имеет три класса, когда я использую InheritanceType.TABLE_PER_CLASS для иерархии классов, она получила " Пакетное обновление ". См. Приведенный ниже код. AbstractBase - базовый класс для иерархии классов.Проблема, когда я использую однонаправленные однонаправленные и таблицы для каждого класса InheritanceType в Hibernate

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 не обновляет Manager таблицу, когда я прошел через спящем SQL. Когда я изменил InheritanceType на InheritanceType.JOINED, код работает хорошо. Я что-то пропустил в однонаправленной конфигурации «Один-ко-многим»?

---------------------------------- обновление ----------- ---------------------

В классе «Человек» я изменил @JoinColumn на @JoinTable в аннотации «Один-ко-многим», работает тестовый код Что ж. Есть ли пропущенная конфигурация для конфигурации @JoinColumn, когда его целевой класс аннотируется «InheritanceType.TABLE_PER_CLASS»?

см ниже подробную аннотацию:

@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<>(); 

---------------------------------- --- update --------------------------------

Я пробовал код с Hibernate 5.2.5 Final , этот вопрос все еще существует.

ответ

0

Возможно, это связано с HHH-9864. Попробуйте с Hibernate 5.2.5 и посмотрите, работает ли он лучше.

+0

Влад, благодарю за информацию. Я попробовал с Hibernate 5.2.5 final, но проблема все еще существует –

Смежные вопросы