カスケードの永続性は、なぜ、新しいエンティティの主キーを生成するために失敗しましたか?

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

  •  25-09-2019
  •  | 
  •  

質問

このコードは次のとおりです。

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

はその後、ユニットテストで私はこれを(OpenJPAのが使用されている)やっています

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

OpenJPAが言います:

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]

なぜIDが自動生成されないのですか?

役に立ちましたか?

解決

あなた1対多の関係は、(mappedByによる)双方向としてマッピングされているが、私は反対側を見ることができません。おそらくそれが原因です。

それは関係の所有側ですけれども多対一側が実際に存在する

そして場合でも、それゆえ、それがデータベースに反映される状態を指定し、コード内で初期化されていない。

あなたが実際に平均一方向の関係、あなたがmappedByを削除する必要がある場合。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top