1

私はそのようなものを持っています

table ACTION
name
resource_type
resource_id

resource_type と resource_id は、リソースのタイプを識別するために使用されます。

resource_type はimageまたはです。resource_type に resource_id がvideo含まれている場合imageは IMAGE テーブルの ID です。resource_type が含まれている場合、resource_id はvideoテーブルの ID です VIDEO

ここで IMAGE および VIDEO テーブル

table IMAGE (*)
id 
imageType

table VIDEO (*)
id
videoType

(*) 表はもっと複雑ですが、説明をわかりやすくするために縮小しました!!!

私も次のクラスを持っています

class Action{
    private Resource resource;
    //getter and setter
}

interface Resource{}

class Image implements Resource{
    private Integer id;
    private String imageType;
    //getter and setter
}

class Video implements Resource{
    private Integer id;
    private String videoType;
    //getter and setter
}

私はこのチュートリアルから識別子属性について何かを理解しようとしました: http://viralpatel.net/blogs/hibernate-inheritence-table-per-hierarchy-mapping/ しかし、例は少し違います...-_-'

Action クラスの Resource オブジェクトに IMAGE end VIDEO テーブルをマップしたいのですが、これらの pojo クラスを hibernate xml マッパーでマップするにはどうすればよいですか?

4

1 に答える 1

2

弁別器を使用する必要はありません。「クラスごとのテーブル」アプローチを使用して継承を使用できます。これがあなたがすることです。

  1. IDである「id」プロパティを持つクラス「Resource」を定義します。
  2. Resource を拡張し、追加のプロパティを追加する 2 つのサブクラス「Image」と「Video」を定義します。この例では、「imageType」と「videoType」です。
  3. リソースに @ManyToOne を持つクラス「Action」を定義します。投稿で説明したように、ここで「resourceType」プロパティが必要な場合は、それを使用できますが、機能させるためにはまったく必要ありません。
  4. 必要な 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)

これがあなたの質問に答えるのに役立つことを願っています.

サラ

于 2013-09-06T02:19:08.277 に答える