Каскадная вставка с JPA / Hibernate (EclipseLink) - PullRequest
1 голос
/ 23 сентября 2011

У меня есть две таблицы, подобные этой

|      PERSON       |     |    EMPLOYEE     |
|  id  |  fullName  |     | personId | code |

EMPLOYEE.personId - это первичный ключ, а также внешний ключ, указывающий на PERSON.id

У меня есть два класса:

@Entity
@Table(name="PERSON")
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Person 
                  implements Serializable {
    protected int id;
    protected String fullName;

    @Id
    @Column("id")
    public int getId() {
         return this.id
    }

    public void setId(int id) {
        this.id = id;
    }

    @Column("fullName")
    public int getFullName() {
         return this.fullName
    }

    public void setId(int fullName) {
        this.fullName = fullName;
    }

}

@Entity
@Table(name="EMPLOYEE")
@PrimaryKeyJoinColumn(name="personId")
public class Employee extends Person
        implements Serializable {

    private String code;

    public Employee(String code) {
        setCode(code);
    }

    @Column("code")
    public String getCode() {
         return this.code
    }

    public void setCode(String code) {
        this.code = code;
    }

}

И когда я хочу вставить новую запись в таблицу EMPLOYEE:

entityTransaction.begin();
Employee emp = new Employee("EMP001");
emp.setFullName("hiri");
this.entityManager.persist(emp);
entityTransaction.commit();

Выдает исключение, которое говорит:

Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (...)
Error Code: 1452
Call: INSERT INTO EMPLOYEE (code, personId) VALUES (?, ?)
    bind => [EMP001, 0]

Как видите, предполагаетсявставьте новую запись Person сначала Employee после этого, но на самом деле это не так, внешний ключ personId=0 вызывает проблему.Вы можете мне помочь?Спасибо!

1 Ответ

2 голосов
/ 26 сентября 2011

Вам не нужно @PrimaryKeyJoinColumn при использовании Inheritance.Это будет управляться для вас автоматически.Вы должны иметь уникальное значение идентификатора, хотя.Если вы собираетесь использовать генерацию последовательности, вам нужно добавить @GeneratedValue к идентификатору.

    @Id
    @GeneratedValue
    @Column("id")
    public int getId() {
        return this.id
    }
...