Java 冬眠鉴别器
我有类似的东西Java 冬眠鉴别器,java,hibernate,hibernate-mapping,discriminator,Java,Hibernate,Hibernate Mapping,Discriminator,我有类似的东西 table ACTION name resource_type resource_id 资源类型和资源id用于区分资源类型: 资源类型可以是图像或视频,如果资源类型包含图像资源id是表图像的id;如果资源类型包含videoresource\u id是表video的id 这里是图像和视频表 table IMAGE (*) id imageType table VIDEO (*) id videoType (*)表格更复杂,但为了更好地解释,我缩小了它 我也有下面的课 cla
table ACTION
name
resource_type
resource_id
资源类型和资源id用于区分资源类型:
资源类型可以是图像
或视频
,如果资源类型包含图像
资源id是表图像的id;如果资源类型包含video
resource\u id是表video的id
这里是图像和视频表
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
}
我试图从本教程中了解有关鉴别器属性的内容:
但例子有点不同…————”
我想在Action类的资源对象中映射IMAGE end VIDEO表,如何使用hibernate xml mapper映射这些pojo类?您不需要使用鉴别器。您可以使用“每类表”方法使用继承。这是你要做的
@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();
Image图像=新图像(“i1”、“图像类型”);
视频=新视频(“v1”,“视频类型”);
动作imageAction=新动作(“imageAction”,图像,“图像”);
动作视频动作=新动作(“视频动作”,视频,“视频”);
坚持(形象);
坚持(视频);
坚持(行动);
坚持(录像行动);
manager.getTransaction().commit();
...
manager.getTransaction().begin();
System.out.println(“**********操作和资源”);
List result1=manager.createQuery(“来自操作”).getResultList();
对于(操作a:result1){
系统输出打印项次(a);
}
manager.getTransaction().commit();
为所有这些类实现toString(),将生成以下输出:
Hibernate:创建表操作(名称varchar(255)不为null,资源类型varchar(255),资源ID varchar(255),主键(名称))
Hibernate:创建表映像(ID varchar(255)不为null,imageProperty varchar(255),主键(ID))
Hibernate:创建表视频(ID varchar(255)不为null,videoProperty varchar(255),主键(ID))
***行动和资源
操作(名称=imageAction资源=图像(id=i1 imageType=imageType)资源类型=图像)
动作(名称=视频动作资源=视频(id=v1视频类型=视频类型)资源类型=视频)
希望这有助于回答您的问题
莎拉请说得更具体些。你的问题到底是什么还不清楚。如果要将图像、视频和动作映射到相应的表,则不需要鉴别器,因为您没有继承。是的,我需要映射图像、视频和动作…..嗯--',为什么不需要鉴别器?在动作类中,我有一个资源对象,但我必须实现图像或视频…鉴别器用于在单个表中存储类层次结构。据我所知,您希望将3个类映射到3个表。这只是正常情况。你试过像往常一样绘制地图吗?如果是,问题出在哪里?我编辑了这篇文章,我希望我能更好地解释我的问题……如果资源是图像或视频,我只知道“运行时”,当我知道
Resource\u type
的值时,我必须区分它,我使用的是xml映射器-