1

클래스 Person과 클래스 계층 구조에 대해 InheritanceType.TABLE_PER_CLASS를 사용할 때 세 클래스가있는 클래스 계층 구조가있을 때 " 일괄 업데이트 "문제. 아래 코드를 참조하십시오. AbstractBase은 클래스 계층 구조의 기본 클래스입니다.최대 절전 모드에서 단방향 1 대 다수 및 테이블 당 클래스 상속 유형을 사용할 때의 문제점

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

출력 : 내가 최대 절전 모드 SQL을 통해 갈 때 Hibernate가 Manager 테이블을 업데이트하지 않는 것으로 확인

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

. InheritanceType을 InheritanceType.JOINED으로 변경하면 코드가 잘 작동합니다. 단방향 일대 다 구성에서 무언가를 놓치고 있습니까?

---------------------------------- 업데이트 ---------------------------------- ------------------- ---------------------

'Person'클래스에서 One-To-Many 주석에서 @JoinColumn을 @JoinTable로 변경했으며 테스트 코드가 작동합니다. 잘. 대상 클래스에 "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<>(); 

:

아래 상세한 주석을 참조하십시오 --- 업데이트 --------------------------------

최대 절전 모드로 코드를 시도했습니다. 5.2.5 결승 문제가 여전히 존재합니다.

답변

0

아마 HHH-9864과 관련 있습니다. Hibernate 5.2.5를 사용해보고 더 잘 작동하는지 확인하라.

+0

블라드, 감사합니다. 나는 Hibernate 5.2.5 final을 시도했지만 문제는 여전히 존재한다. –