Проблема, когда я использую однонаправленный One-To-Many и Table Per Class InheritanceType в Hibernate

У меня есть класс Person и иерархия классов, в которой есть три класса, когда я использую InheritanceType.TABLE_PER_CLASS для иерархии классов, возникает проблема «Пакетное обновление». Пожалуйста, смотрите приведенный ниже код. AbstractBase — это базовый класс для иерархии классов.

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, код работает хорошо. Я что-то упустил в однонаправленной конфигурации One-To-Many?

----------------------------------Обновить--------------- ------------------

В классе 'Person' я изменил @JoinColumn на @JoinTable в аннотации One-To-Many, код тестирования работает хорошо. Есть ли пропущенная конфигурация для конфигурации @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<>();

-------------------------------------Обновить------------ --------------------

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


person Zhiqiang Liu    schedule 12.12.2016    source источник


Ответы (1)


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

person Vlad Mihalcea    schedule 13.12.2016
comment
Влад, спасибо за информацию. Я пробовал с финальной версией Hibernate 5.2.5, но проблема все еще существует. - person Zhiqiang Liu; 14.12.2016