(10)映射继承关系一之继承关系都映射在一张表中(@Inheritance(strategy=InheritanceType.SINGLE_TABLE))

来源:互联网 发布:linux中的pwd命令 编辑:程序博客网 时间:2024/06/06 19:45

EJB3支持三种类型的继承映射:
• 每个类一张表(Table per class)策略: 在Hibernate中对应元素:
• 每个类层次结构一张表(Single table per class hierarchy)策略:在Hibernate中对应元素
• 连接的子类(Joined subclasses)策略:在Hibernate中对应 元素

一、每个类层次结构一张表【整个继承层次结构中的父类和子类的所有属性都映射在一张表中】:通过区分符来区分discriminator
@Inheritance 和 @DiscriminatorColumn 注解只能用于实体层次结构的顶端.
在下面的例子中,person是父类,在这个类里面讲继承策略定义为InheritanceType.SINGLE_TABLE,并通过@DiscriminatorColumn注释定义了辨别符列(还可以定义辨别符的类型)。最后,对于继承层次结构中的每个类,,@DiscriminatorValue注释指定了用来辨别该类的值。辨别符列的名字默认是DTYPE,其默认值为实体名,默认类型是DiscriminatorType.STRING.

@Entity@Inheritance(strategy=InheritanceType.SINGLE_TABLE)//继承策略是每个类层次结构映射一张表@DiscriminatorColumn(name="discrimitor",discriminatorType=DiscriminatorType.STRING)//定义了辨别符列,和辨别符的类型//上面的两行注解只能用于实体层次结构的顶端@DiscriminatorValue("person")//用于辨别该类的值public class Person {    private int id;    private String name;    @Id    @GeneratedValue    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }   }

student继承父类person【@DiscriminatorValue】

@Entity@DiscriminatorValue("student")public class student extends Person {    private int score;    public int getScore() {        return score;    }    public void setScore(int score) {        this.score = score;    }   }//teacher表类似,略

通过这种方式,则person表中会有父类和子类所有的属性和区分符,当某个子类的字段较多时,会造成存储空间大量的浪费

 create table Person (        discrimitor varchar(31) not null,        id integer not null auto_increment,        name varchar(255),        title varchar(255),        score integer,        primary key (id)    )

Read:当指定是哪个子类时,会依据 student0_.id=? and student0_.discrimitor=’student’来搜索
当没有指定时,就会按照父类id进行搜索 person0_.id=?

@Test    public void testGet() {        testSave();        Session session=sf.getCurrentSession();        session.beginTransaction();        student s=(student) session.get(student.class, 1);        /*         * 指定取哪个对象,则只会输出该对象的信息        select        student0_.id as id0_0_,        student0_.name as name0_0_,        student0_.score as score0_0_         from        Person student0_         where        student0_.id=?         and student0_.discrimitor='student'         */        Person p=(Person) session.get(Person.class, 2);        /*         * 没有指定是哪个对象,则会select person中的所有项        select        person0_.id as id0_0_,        person0_.name as name0_0_,        person0_.title as title0_0_,        person0_.score as score0_0_,        person0_.discrimitor as discrimi1_0_0_         from        Person person0_         where        person0_.id=?         */        session.getTransaction().commit();      }

二、

阅读全文
0 0
原创粉丝点击