la persistance Cascade ne parvient pas à générer une clé primaire pour une nouvelle entité, pourquoi?

StackOverflow https://stackoverflow.com/questions/4204127

  •  25-09-2019
  •  | 
  •  

Question

Voici le code:

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

Ensuite, 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?

Était-ce utile?

La solution

Vous l'un à-plusieurs mises en correspondance bidirectionnelle (en raison de mappedBy), mais je ne peux pas voir l'autre côté. Peut-être est la cause.

Et même si beaucoup à un côté existe en fait, ce n'est pas initialisé dans votre code si c'est un côté possédante de la relation, donc il précise l'état se refléter dans la base de données.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top