[Hibernate - 4.1.9.Final] [MySQL ドライバー]
こんにちは、私は次のエンティティを持っています。
動物 :
@Entity
@Table( name = "ANIMAL" )
@Inheritance( strategy = InheritanceType.TABLE_PER_CLASS )
public abstract class Animal implements Serializable
{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue( strategy = GenerationType.TABLE )
@Column( name = "ANIMAL_ID" )
public Long id;
@Column( name = "ANIMAL_NAME" )
public String name;
}
犬 :
@Entity
@Table( name = "DOG" )
public class Dog extends Animal implements Cloneable, Serializable
{
private static final long serialVersionUID = 1L;
@ManyToOne
@JoinTable( name = "DOG_OTHER_DOG" )
public Dog dog;
}
Dogエンティティに循環関係があります。
@ManyToOne
@JoinTable( name = "DOG_OTHER_DOG" )
public Dog dog;
次に、Hibernate Session API を使用して新しい犬を永続化しようとしています。
@Transactional
public void testAnimalJoinTable()
{
Dog dogFirst = new Dog();
dogFirst.name = "FirstDog";
Session session = sessionFactory.getCurrentSession();
session.save( dogFirst );
Dog dogSecond = new Dog();
dogSecond.dog = dogFirst;
dogSecond.name = "SecondDog";
session.save( dogSecond );
}
スキーマが適切に作成されている
Hibernate: create table DOG (ANIMAL_ID bigint not null, ANIMAL_NAME varchar(255), primary key (ANIMAL_ID)) ENGINE=InnoDB
Hibernate: create table DOG_OTHER_DOG (dog_ANIMAL_ID bigint, ANIMAL_ID bigint not null, primary key (ANIMAL_ID)) ENGINE=InnoDB
しかし最後に、Hibernate は常に save メソッドで失敗し、スローします。
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:「フィールド リスト」の不明な列「dog_ANIMAL_ID」
実際、Hibernate は結合テーブルを使用して犬を保存しません。
Hibernate: 更新用に sequence_name = 'ANIMAL' である hibernate_sequences から sequence_next_hi_value を選択します。
Hibernate: hibernate_sequences(sequence_name, sequence_next_hi_value) に挿入します
。どこで sequence_next_hi_value = ? and sequence_name = 'ANIMAL'
Hibernate: DOG (ANIMAL_NAME, dog_ANIMAL_ID, ANIMAL_ID) 値 (?, ?, ?) に挿入
さて、私の質問は (:
- Hibernate が結合テーブルを使用しなかったのはなぜですか? (動物の継承を削除すると、すべて正常に動作します)
- 私の場合、どうすれば問題を解決できますか?
前もって感謝します !
PS: @MappedSuperclass を使用してこの問題を解決することはできません..