0

私は、hibernate 5.2で単一テーブルの継承を実装しようとしています。 基本クラスSingleTableでのHibernate継承

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="type", discriminatorType= DiscriminatorType.STRING) 
@DiscriminatorValue("HAKSAHIBI") 
@DiscriminatorOptions(force=true) 
public class PropertyOwner implements implements Serializable{ 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    long id; 
    @ManyToOne 
    Property property; 
    @ManyToOne 
Person person; 

} 

AuthorクラスはPropertyOwnerを拡張:

@Entity 
@DiscriminatorValue("COMPOSER") 
class Composer extends PropertyOwner { 
} 

人クラス::

public class Person { 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    long id; 
String title; 
} 

プロパティCLA

@Entity 
@DiscriminatorValue("AUTHOR") 
class Author extends PropertyOwner { 
} 

作曲クラスはPropertyOwnerを拡張しますSS

public class Property{ 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    long id; 
String title; 

@OneToMany 
Set<Composer> composers = new HashSet<Composer>(); 

@OneToMany 
Set<Author> authors = new HashSet<Author>(); 
} 

私は、次のようなテーブル構造を期待しています:

CREATE TABLE `Property` (
    `id` bigint(20) NOT NULL, 
    `title` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

CREATE TABLE `Person` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `title` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

CREATE TABLE `PropertyOwner` (
    `type` varchar(31) NOT NULL, 
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `property_id` bigint(20) DEFAULT NULL, 
    `person_id` bigint(20) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `FK77apjkkl14xwe45rs1ocgtt4u` (`property_id`), 
    KEY `FKqagfofgupovfly26enivfhm3j` (`person_id`), 
    CONSTRAINT `FK77apjkkl14xwe45rs1ocgtt4u` FOREIGN KEY (`property_id`) REFERENCES `property` (`id`), 
    CONSTRAINT `FKqagfofgupovfly26enivfhm3j` FOREIGN KEY (`person_id`) REFERENCES `person` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

しかし残念ながら、それは私が間違っているのは何次の文

CREATE TABLE `property_propertyOwner` (
    `Property_id` bigint(20) NOT NULL, 
    `author_id` bigint(20) NOT NULL, 
    `composer_id` bigint(20) NOT NULL, 
    UNIQUE KEY `UK_rv9fxc06rcydqp6dqpqbmrkie` (`author_id`), 
    UNIQUE KEY `UK_fm4v55i021l5smuees0vs3qmy` (`composer_id`), 
    KEY `FKt3yqcltkd0et8bj08ge0sgrqb` (`Property_id`), 
    CONSTRAINT `FK1pj2606cjxrb70ps89v7609hg` FOREIGN KEY (`author_id`) REFERENCES `PropertyOwner` (`id`), 
    CONSTRAINT `FKfdh3r95jffvd07u3xn21824r7` FOREIGN KEY (`composer_id`) REFERENCES `PropertyOwner` (`id`), 
    CONSTRAINT `FKt3yqcltkd0et8bj08ge0sgrqb` FOREIGN KEY (`Property_id`) REFERENCES `Property` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

と著者と作曲のクラスの別のテーブルを作成しますか?私はproperty_PropertyOwnerテーブルが作成されるべきではなく、作成者クラス、Composerクラス情報がpropertyOwnerテーブルに保持されるはずです。

注:Enumaratedアノテーションを試しましたが、今回はプロパティクラスでSetauthorフィールドを定義できません.Setを定義し、そのオブジェクトにenum情報を追加する必要があります。 ありがとうございます。

+0

マッピングで 'mappedBy'が不足しているようです。 –

答えて

1

プロパティエンティティにサブクラス(作成者と作成者)が複数関連付けられている必要はありません。単一のテーブル継承がある、つまり、プロパティ所有者テーブルにはproperty_idの外部キーがあります。 その代わりに、あなたは単一の関連付けを持つことができます。

@OneToMany 
Set<PropertyOwner> composers = new HashSet<PropertyOwner>(); 

そして、あなたはDiscriminatorColumnタイプを使用してメモリに作家や作曲にこのセットを分割することができます。

+0

プロパティとデータベースでAuthorとComposerオブジェクトを使用するには、パフォーマンス上の問題があるため、単一のテーブルがデータを保持します。 PropertyOwnerを変更した場合、私はオブジェクトとしてAuthorを使用できません。 –

+0

単一のテーブル継承を使用しているので、プロパティエンティティで作成者オブジェクトまたはコンポーザオブジェクトを取得します。 Hibernateは、識別器の値に応じてこれを適切なサブクラスオブジェクトにキャストします。 – shubham

関連する問題