У меня есть класс 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 , этот вопрос все еще существует.
Влад, благодарю за информацию. Я попробовал с Hibernate 5.2.5 final, но проблема все еще существует –