SINGLE_TAB継承のHibernate設定で、@DiscriminatorColumnが無視され、クエリが常に 'dtype'列にデフォルト設定されているような奇妙な状況があります。アノテーションをまったく含めなかったときの動作(デフォルトのカラム名は 'dtype')と似ています。常にdtypeを使用しているHibernate
基本エンティティ:
@Entity
@Table(name = "post")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(columnDefinition = "post_type", discriminatorType = DiscriminatorType.STRING)
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@Column(name = "title")
private String title;
@Column(name = "body")
private String body;
@NotNull
@Column(name = "post_type", insertable = false, updatable = false)
private String postType;
// other simple columns
// ommit getters/setters + hashcode etc
}
サブクラスエンティティ:
@Entity
@DiscriminatorValue(value = "EVENT")
public class Event extends Post {
// ommitted basic methods, no extra config
}
Iは、各オブジェクト(postTypeフィールド)内のディスクリミネータ値自体へのアクセスを必要とします。それが原因ではないように私はそれを削除しても、私はまだ同じ動作をしています。
私はJPAリポジトリを通じてサブクラスでクエリを実行しよう:
public interface EventRepository extends JpaRepository<Event, Integer> {
List<Event> findAll();
}
Hibernateはクエリを生成します。
'DTYPEは'」doesnのようもちろん、エラーが発生しselect post0_.id as id2_4_, post0_.bodyl as body_bod3_4_, post0_.title as title12_4_
from post post0_
where post0_.dtype='EVENT'
テーブルには存在しません。
奇妙なことは、Postエンティティで@DiscriminatorFormula( "post_type")を使用すると、すべてが機能しているようです。しかし、私は@DiscriminatorColumnを私のニーズに正確に適合させるために使用する方が好きです。
私はHibernate 5.2.10-FINALとSpring Data JPA 1.11.4を使用しています。
これを引き起こす可能性のあるアイデアはありますか?