Cascade Persistenz nicht für eine neue Einheit Primärschlüssel zu generieren, warum?

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

  •  25-09-2019
  •  | 
  •  

Frage

Dies ist der 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;
  }
}

Dann in einem Unit-Test Ich mache diesen (OpenJPA verwendet wird):

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

OpenJPA sagt:

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]

Warum ID ist nicht automatisch generiert?

War es hilfreich?

Lösung

Sie eine Eins-zu-viele-Beziehung wird als bidirektional (aufgrund mappedBy) abgebildet, aber ich kann nicht auf die andere Seite sehen. Vielleicht ist es die Ursache ist.

Und auch wenn viele-zu-eins-Seite tatsächlich vorhanden ist, ist es nicht in Ihrem Code initialisiert, obwohl es sich um eine zu besitzen Seite der Beziehung ist, daher gibt es den Zustand in der Datenbank berücksichtigt werden.

Wenn Sie tatsächlich mittlere unidirektionale Beziehung, müssen Sie mappedBy entfernen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top