弁別器を使用する必要はありません。「クラスごとのテーブル」アプローチを使用して継承を使用できます。これがあなたがすることです。
- IDである「id」プロパティを持つクラス「Resource」を定義します。
- Resource を拡張し、追加のプロパティを追加する 2 つのサブクラス「Image」と「Video」を定義します。この例では、「imageType」と「videoType」です。
- リソースに @ManyToOne を持つクラス「Action」を定義します。投稿で説明したように、ここで「resourceType」プロパティが必要な場合は、それを使用できますが、機能させるためにはまったく必要ありません。
- 必要な ID 生成のタイプ (存在する場合) や、Action から Resource へのカスケードのタイプがわからないので、簡単にするために、これらの両方に何もないと仮定しました。
このアプローチでは、データベースに 3 つのテーブルを取得します。
実装のシェルは次のとおりです。
@Entity
@Inheritance (strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Resource {
@Id
@Column(name="ID")
private String id;
public Resource() {}
public Resource(String id) { this.id = id; }
... // getters and setters
}
@Entity
/* Table per Concrete Class */
@Table (name="Image")
public class Image extends Resource {
private String imageType; // Other properties unique to Image
public Image() {}
public Image(String id) { super(id); }
public Image(String id, ...) { super(id); .... // setters }
... // getters and setters
}
/* Table per Concrete Class */
@Table (name="Video")
public class Video extends Resource {
private String videoType; // Other properties unique to Video
public Video() {}
public Video(String id) { super(id); }
public Video(String id, ...) { super(id); .... // setters }
... // getters and setters
}
このアプローチでは、次の単体テストで目的の動作が示されます。
Image image = new Image("i1", "imageType");
Video video = new Video("v1", "videoType");
Action imageAction = new Action("imageAction", image, "image");
Action videoAction = new Action("videoAction", video, "video");
manager.persist(image);
manager.persist(video);
manager.persist(imageAction);
manager.persist(videoAction);
manager.getTransaction().commit();
...
manager.getTransaction().begin();
System.out.println("********** Actions and Resources");
List<Action> result1 = manager.createQuery( "from Action" ).getResultList();
for ( Action a : result1 ) {
System.out.println(a);
}
manager.getTransaction().commit();
これらすべてのクラスに toString() を実装すると、次の出力が生成されます。
Hibernate: create table Action (NAME varchar(255) not null, RESOURCE_TYPE varchar(255), RESOURCE_ID varchar(255), primary key (NAME)) Hibernate: create table Image (ID varchar(255) not null, imageProperty varchar(255) )、主キー (ID)) Hibernate: テーブルを作成 Video (ID varchar(255) not null、videoProperty varchar(255)、主キー (ID))
****アクションとリソース Action( name=imageAction resource=Image( id=i1 imageType=imageType) resourceType=image) Action( name=videoAction resource=Video( id=v1 videoType=videoType) resourceType=video)
これがあなたの質問に答えるのに役立つことを願っています.
サラ