1

Ich habe eine Klasse Person und eine Klassenhierarchie, die drei Klassen hat, wenn ich InheritanceType.TABLE_PER_CLASS für die Klassenhierarchie verwendet, bekam es die " Batch Update "Problem. Bitte beachten Sie den folgenden Code. AbstractBase ist die Basisklasse für die Klassenhierarchie.Ein Problem, wenn ich unidirektionale One-To-Many und Tabelle pro Klasse InheritanceType in 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; 
    } 
} 

Prüfregeln:

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

Ausgang:

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

Ich fand, dass Hibernate nicht die Manager Tabelle nicht aktualisiert, wenn ich durch die Hibernate SQL ging. Wenn ich den InheritanceType zu InheritanceType.JOINED änderte, funktioniert der Code gut. Verpasse ich etwas in der unidirektionalen One-To-Many-Konfiguration?

---------------------------------- Aktualisierung ----------- ---------------------

In der Klasse 'Person' habe ich @JoinColumn in @JoinTable in One-To-Many-Annotation geändert, der Testcode funktioniert Gut. Gibt es eine verpasste Konfiguration für die @JoinColumn-Konfiguration, wenn die Zielklasse mit "InheritanceType.TABLE_PER_CLASS" versehen ist?

Siehe unten, um detaillierte Anmerkung:

@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 --------------------------------

Ich habe den Code mit Hibernate 5.2.5 Final versucht Das Problem besteht immer noch.

Antwort

0

Vielleicht ist es mit HHH-9864 verwandt. Versuchen Sie es mit Hibernate 5.2.5 und sehen Sie, ob es besser funktioniert.

+0

Vlad, danke Ihre Informationen. Ich habe es mit Hibernate 5.2.5 final versucht, aber das Problem besteht immer noch –

Verwandte Themen