次の JPA エンティティ クラスがあります (例)。ハウスは 1 つのストリートに属します。通りには多くの家があります。
@Entity
public class House {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Integer id;
public String name
@ManyToOne
public Street street;
}
@Entity
public class Street {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Integer id;
@OneToMany(mappedBy="street")
public Set<House> houses;
}
生成タイプを ID に設定しています。これは、新しい ID を自動的に割り当てることになっています。
新しい Street を持つ新しい House を作成するときは、最初に Street を作成して保持し、次に House を作成する必要があります。これは、CascadeType を PERSIST に設定していないためで、手動で行う必要があります [1]。ただし、新しく作成されたストリートを挿入する際:
Street street = new Street();
entityManager.persist(street);
Hibernate/JPA は次の SQL クエリを生成します。
insert into Street default values
これは MySQL が好まないものです。
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'default values' at line 1
理由はありますか?私は Java 6、MySQL 5.0.67 を Hibernate の JPA (バージョン 3.2.1.ga) の実装と共に使用しています。
[1] EJB 3 in Action ページ 318-319