2011-09-23 5 views
1

J'ai deux tables comme celui-ciCascade insérer avec JPA/Hibernate (EclipseLink)

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

EMPLOYEE.personId est une clé primaire, ainsi que clé étrangère pointant à PERSON.id

Je ces deux classes:

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

} 

Et quand je veux insérer un nouvel enregistrement dans la table EMPLOYÉ:

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

Il lance une exception dit:

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] 

Comme vous pouvez le voir, il est censé insérer un nouvel enregistrement de personne d'abord un employé après, mais en fait, il ne fait pas, les personId=0 clés étrangères des causes le problème. Pouvez-vous m'aider? Merci!

Répondre

2

Vous n'avez pas besoin de @PrimaryKeyJoinColumn lorsque vous utilisez Héritage. Il sera géré pour vous automatiquement. Vous devez cependant avoir une valeur d'identifiant unique. Si vous avez l'intention d'utiliser la génération de séquence, vous devez ajouter @GeneratedValue à l'identifiant.

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