Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 冬眠鉴别器_Java_Hibernate_Hibernate Mapping_Discriminator - Fatal编程技术网

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类?

您不需要使用鉴别器。您可以使用“每类表”方法使用继承。这是你要做的

  • 定义具有id属性的类“资源”,该属性是一个id
  • 定义两个子类“Image”和“Video”,它们扩展了资源并添加了额外的属性——在您的示例中是“imageType”和“videoType”
  • 定义类“Action”,该类对资源具有@ManyToOne。如果您想要“resourceType”属性,正如您在文章中所描述的那样,您可以拥有它,但是完全没有必要让它正常工作
  • 我不确定您想要哪种类型的id生成(如果有的话),或者从操作到资源的级联类型,所以为了简单起见,我假设这两种类型都没有
  • 使用这种方法,您将在数据库中获得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();
    
    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映射器-