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

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值