2

[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 を使用してこの問題を解決することはできません..

4

0 に答える 0