2010-11-17 3 views
0

Voici le code:La persistance en cascade échoue à générer une clé primaire pour une nouvelle entité, pourquoi?

@Entity 
public class Dept { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 
    @OneToMany(
    mappedBy = "dept", 
    cascade = CascadeType.ALL 
) 
    private List<Employee> employees = new ArrayList<Employee>(); 
    public void addEmployee(Employee emp) { 
    this.employees.add(emp); 
    } 
} 

@Entity 
public class Employee { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 
    @Column private Integer age; 
    public Employee(Integer a) { 
    this.age = a; 
    } 
} 

Puis, dans un test unitaire je fais cela (OpenJPA est utilisé):

// ... 
Dept dept = new Dept(); 
dept.addEmployee(new Employee(25)); 
this.em.persist(dept); 

OpenJPA dit:

Caused by: <openjpa-1.2.1-r752877:753278 nonfatal general error> 
org.apache.openjpa.persistence.PersistenceException: Attempt to insert 
null into a non-nullable column: column: ID table: EMPLOYEE in 
statement [INSERT INTO employee (age) VALUES (?)] 
{prepstmnt 841687127 INSERT INTO employee (age) VALUES (?) 
[params=(int) 25]} [code=-10, state=23000] 

Pourquoi ID est pas généré automatiquement?

+0

Vous devriez probablement vérifier votre code: @Column private Integer age; public Employee (Integer age) { this.age = âge; } – Pau

+0

Avez-vous un attribut pour département du côté Employé. Cela semble manquer dans le code. La cartographie par des moyens, le côté est l'entité propriétaire. Essayez de supprimer mappedby et de faire la persistance. – lalit

Répondre

1

Votre relation un-à-plusieurs est mappée comme bidirectionnelle (en raison de mappedBy), mais je ne peux pas voir l'autre côté. Peut-être que c'est la cause.

Et même si un côté plusieurs-à-un existe réellement, il n'est pas initialisé dans votre code bien qu'il s'agisse d'un côté propriétaire de la relation, il spécifie donc l'état à refléter dans la base de données.

Si vous voulez réellement dire relation unidirectionnelle, vous devez supprimer mappedBy.

Questions connexes