• Hibernate每个层次类一张表(使用注释)


    在上一文章中,我们使用xml文件将继承层次映射到一个表。 在这里,我们将使用注释来执行同样的任务。需要使用@Inheritance(strategy = InheritanceType.SINGLE_TABLE)@DiscriminatorColumn@DiscriminatorValue注释,以便根据层次结构策略映射表。

    在每个层次结构一张表的情况下,只需要一个表来映射继承层次结构。 这里,在表中创建一个额外的列(也称为discriminator列)来标识该类。

    下面来看看看继承层次结构:

    这个层次结构中有三个类。 EmployeeRegular_EmployeeContract_Employee类的父类。

    此层次结构的表结构如下所示:

    列名数据类型是否为空默认值是否主键
    id int(10) -
    type varchar(254) - -
    name varchar(254) - -
    salary float - -
    bonus int(10) - -
    pay_per_hour float - -
    contract_duration   - -

    使用注释的每个层次结构一张表示例

    您需要按照以下步骤创建简单示例:

    • 创建持久化类
    • 创建配置文件
    • 创建类来存储提取数据

    创建一个项目名称为:,其结构如下图所示 -

    1)创建持久类

    您需要创建表示继承的持久化类。为上面的层次结构创建三个类:

    文件:Employee.java

    package com.yiibai;
    
    import javax.persistence.*;
    
    @Entity  
    @Table(name = "employee101")  
    @Inheritance(strategy=InheritanceType.SINGLE_TABLE)  
    @DiscriminatorColumn(name="type",discriminatorType=DiscriminatorType.STRING)  
    @DiscriminatorValue(value="employee")  
    public class Employee {
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name = "id")
        private int id;
    
        @Column(name = "name")
        private String name;
    
        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;
        }
    
        // setters and getters
    }
    
    Java

    文件:Regular_Employee.java

    package com.yiibai;
    
    /**
     * 
     * @author by maxsu
     * @copyright http://www.yiibai.com
     * @link download at: http://www.yiibai.com/siteinfo/download.html
     */
    import javax.persistence.*;
    
    @Entity  
    @DiscriminatorValue("regularemployee")  
    public class Regular_Employee extends Employee {
    
        @Column(name = "salary")
        private float salary;
    
        @Column(name = "bonus")
        private int bonus;
    
        public float getSalary() {
            return salary;
        }
    
        public void setSalary(float salary) {
            this.salary = salary;
        }
    
        public int getBonus() {
            return bonus;
        }
    
        public void setBonus(int bonus) {
            this.bonus = bonus;
        }
    
    }
    
    Java

    文件:Contract_Employee.java

    package com.yiibai;
    
    /**
     * 
     * @author by maxsu
     * @copyright http://www.yiibai.com
     * @link download at: http://www.yiibai.com/siteinfo/download.html
     */
    import javax.persistence.*;
    
    @Entity  
    @DiscriminatorValue("contractemployee")  
    public class Contract_Employee extends Employee {
    
        @Column(name = "pay_per_hour")
        private float pay_per_hour;
    
        @Column(name = "contract_duration")
        private String contract_duration;
    
        public float getPay_per_hour() {
            return pay_per_hour;
        }
    
        public void setPay_per_hour(float payPerHour) {
            pay_per_hour = payPerHour;
        }
    
        public String getContract_duration() {
            return contract_duration;
        }
    
        public void setContract_duration(String contractDuration) {
            contract_duration = contractDuration;
        }
    }
    
    Java

    2)在配置文件中添加持久化类

    打开hibernate.cfg.xml文件,并添加实体类的项,如下所示:

    <?xml version='1.0' encoding='UTF-8'?>
    <!DOCTYPE hibernate-configuration PUBLIC
              "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    
    <!-- Generated by MyEclipse Hibernate Tools. -->
    <hibernate-configuration>
    
        <session-factory>
             <property name="hbm2ddl.auto">update</property>
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
            <property name="connection.username">root</property>
            <property name="connection.password">123456</property>
            <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
    
            <property name="show_sql">true</property>
            <mapping class="com.yiibai.Employee"/>  
            <mapping class="com.yiibai.Contract_Employee"/>   
            <mapping class="com.yiibai.Regular_Employee"/>   
        </session-factory>
    
    </hibernate-configuration>
    
    XML

    hbm2ddl.auto属性定义是用于在数据库中自动创建表。

    3)创建存储持久对象的类

    在这个类中,我们只是将 Employee 对象存储在数据库中。
    文件:MainTest.java

    package com.yiibai;
    
    import org.hibernate.*;
    import org.hibernate.boot.MetadataSources;
    import org.hibernate.boot.registry.StandardServiceRegistry;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    
    /**
     * 
     * @author by maxsu
     * @copyright http://www.yiibai.com
     * @link download at: http://www.yiibai.com/siteinfo/download.html
     */
    
    public class MainTest {
        public static void main(String[] args) {
            // 但在5.1.0版本汇总,hibernate则采用如下新方式获取:
            // 1. 配置类型安全的准服务注册类,这是当前应用的单例对象,不作修改,所以声明为final
            // 在configure("cfg/hibernate.cfg.xml")方法中,如果不指定资源路径,默认在类路径下寻找名为hibernate.cfg.xml的文件
            final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
                    .configure("hibernate.cfg.xml").build();
            // 2. 根据服务注册类创建一个元数据资源集,同时构建元数据并生成应用一般唯一的的session工厂
            SessionFactory sessionFactory = new MetadataSources(registry)
                    .buildMetadata().buildSessionFactory();
    
            /**** 上面是配置准备,下面开始我们的数据库操作 ******/
            Session session = sessionFactory.openSession();// 从会话工厂获取一个session
    
            // creating transaction object
            Transaction t = session.beginTransaction();
    
            Employee e1 = new Employee();
            e1.setName("用户名-01");
    
            Regular_Employee e2 = new Regular_Employee();
            e2.setName("yiibai su");
            e2.setSalary(50002);
            e2.setBonus(5);
    
            Contract_Employee e3 = new Contract_Employee();
            e3.setName("Mina su");
            e3.setPay_per_hour(1010);
            e3.setContract_duration("15 hours");
    
            session.persist(e1);
            session.persist(e2);
            session.persist(e3);
    
            t.commit();
            session.close();
            System.out.println("success");
        }
    }
    
    Java

    执行上面示例,输出结果如下 -

    log4j:WARN No appenders could be found for logger (org.jboss.logging).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
    Sun Mar 26 02:19:13 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
    Sun Mar 26 02:19:14 CST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
    Hibernate: select next_val as id_val from hibernate_sequence for update
    Hibernate: update hibernate_sequence set next_val= ? where next_val=?
    Hibernate: select next_val as id_val from hibernate_sequence for update
    Hibernate: update hibernate_sequence set next_val= ? where next_val=?
    Hibernate: select next_val as id_val from hibernate_sequence for update
    Hibernate: update hibernate_sequence set next_val= ? where next_val=?
    Hibernate: insert into employee101 (name, type, id) values (?, 'employee', ?)
    Hibernate: insert into employee101 (name, bonus, salary, type, id) values (?, ?, ?, 'regularemployee', ?)
    Hibernate: insert into employee101 (name, contract_duration, pay_per_hour, type, id) values (?, ?, ?, 'contractemployee', ?)
    success
    
    Shell

    查看数据表,应该会看到相应的数据记录

  • 相关阅读:
    典型的 C++ 程序员成长经历
    C语言中的常用文件操作
    sscanf与正则表达式
    黑莓8700 常用快捷键
    [分享]《张靓颖个人资源汇集.九月二日更新》
    [分享]【★超级女声★】【★张靓颖★】【推荐】
    [原创]根据TreeView中节点的不同,来绑定不同的dropdownlist
    [转贴]用Vs.net制作安装程序,在安装包中自动为客户创建数据库
    [转贴]在Asp.Net中的几种事务处理的方法
    冻结DataGrid中的列的比较简单的实现方法!
  • 原文地址:https://www.cnblogs.com/borter/p/9522290.html
Copyright © 2020-2023  润新知