搜索
首页数据库mysql教程hibernate 映射继承关系
hibernate 映射继承关系Jun 07, 2016 pm 02:51 PM
hibernate一般关系实现方式映射继承

实现方式一般有三种: 1. 继承关系树每个具体类对应一张表(不介绍) 2. 继承关系树的根类对应一张表 3. 继承关系树的每个类对应一张表 先介绍关系: DayEmployee和MonthEmploy是Employee的子类,并且Company和Employee是一对多关系: 具体代码如下: Compan

实现方式一般有三种:
1. 继承关系树每个具体类对应一张表(不介绍)
2. 继承关系树的根类对应一张表
3. 继承关系树的每个类对应一张表

先介绍关系:
DayEmployee和MonthEmploy是Employee的子类,并且Company和Employee是一对多关系:

具体代码如下:

Company.java

<code class=" hljs java"><span class="hljs-keyword">import</span> java.util.HashSet;
<span class="hljs-keyword">import</span> java.util.Set;

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Company</span> {</span>
    <span class="hljs-keyword">private</span> Integer id;
    <span class="hljs-keyword">private</span> String name;
    <span class="hljs-keyword">private</span> Set<Employee> employees = <span class="hljs-keyword">new</span> HashSet<Employee>();

    <span class="hljs-keyword">public</span> <span class="hljs-title">Company</span>() {
        <span class="hljs-keyword">super</span>();
    }
    <span class="hljs-keyword">public</span> <span class="hljs-title">Company</span>(String name) {
        <span class="hljs-keyword">super</span>();
        <span class="hljs-keyword">this</span>.name = name;
    }
    <span class="hljs-keyword">public</span> Integer <span class="hljs-title">getId</span>() {
        <span class="hljs-keyword">return</span> id;
    }
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setId</span>(Integer id) {
        <span class="hljs-keyword">this</span>.id = id;
    }
    <span class="hljs-keyword">public</span> String <span class="hljs-title">getName</span>() {
        <span class="hljs-keyword">return</span> name;
    }
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setName</span>(String name) {
        <span class="hljs-keyword">this</span>.name = name;
    }
    <span class="hljs-keyword">public</span> Set<Employee> <span class="hljs-title">getEmployees</span>() {
        <span class="hljs-keyword">return</span> employees;
    }
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setEmployees</span>(Set<Employee> employees) {
        <span class="hljs-keyword">this</span>.employees = employees;
    }
}</code>

Employee.java

<code class=" hljs cs">    <span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> Employee {
    <span class="hljs-keyword">private</span> Integer id;
    <span class="hljs-keyword">private</span> String name;
    <span class="hljs-keyword">private</span> Integer age;
    <span class="hljs-keyword">private</span> Company company;
    <span class="hljs-keyword">public</span> Company <span class="hljs-title">getCompany</span>() {
        <span class="hljs-keyword">return</span> company;
    }
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setCompany</span>(Company company) {
        <span class="hljs-keyword">this</span>.company = company;
    }
    <span class="hljs-keyword">public</span> Integer <span class="hljs-title">getId</span>() {
        <span class="hljs-keyword">return</span> id;
    }
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setId</span>(Integer id) {
        <span class="hljs-keyword">this</span>.id = id;
    }
    <span class="hljs-keyword">public</span> String <span class="hljs-title">getName</span>() {
        <span class="hljs-keyword">return</span> name;
    }
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setName</span>(String name) {
        <span class="hljs-keyword">this</span>.name = name;
    }
    <span class="hljs-keyword">public</span> Integer <span class="hljs-title">getAge</span>() {
        <span class="hljs-keyword">return</span> age;
    }
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setAge</span>(Integer age) {
        <span class="hljs-keyword">this</span>.age = age;
    }

}
</code>

DayEmployee.java

<code class=" hljs java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DayEmployee</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Employee</span>{</span>
    <span class="hljs-keyword">private</span> Double dayMoney;

    <span class="hljs-keyword">public</span> Double <span class="hljs-title">getDayMoney</span>() {
        <span class="hljs-keyword">return</span> dayMoney;
    }
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setDayMoney</span>(Double dayMoney) {
        <span class="hljs-keyword">this</span>.dayMoney = dayMoney;
    }

}
</code>

MonthEmploy.java

<code class=" hljs java">    <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MonthEmploy</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Employee</span>{</span>
    <span class="hljs-keyword">private</span> Double monthMoney;

    <span class="hljs-keyword">public</span> Double <span class="hljs-title">getMonthMoney</span>() {
        <span class="hljs-keyword">return</span> monthMoney;
    }
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setMonthMoney</span>(Double monthMoney) {
        <span class="hljs-keyword">this</span>.monthMoney = monthMoney;
    }

}
</code>

Company.hbm.xml

<code class=" hljs xml"><span class="hljs-pi"><?xml version="1.0"?></span>
<span class="hljs-doctype"><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"></span>
<span class="hljs-tag"><<span class="hljs-title">hibernate-mapping</span> <span class="hljs-attribute">package</span>=<span class="hljs-value">"com.dongecs.test1.pojo"</span>></span>
    <span class="hljs-tag"><<span class="hljs-title">class</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"Company"</span> <span class="hljs-attribute">table</span>=<span class="hljs-value">"COMPANY"</span>></span>
        <span class="hljs-tag"><<span class="hljs-title">id</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"id"</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"java.lang.Integer"</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">column</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"ID"</span> /></span>
            <span class="hljs-tag"><<span class="hljs-title">generator</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"native"</span> /></span>
        <span class="hljs-tag"></<span class="hljs-title">id</span>></span>
        <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"name"</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"java.lang.String"</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">column</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"NAME"</span> /></span>
        <span class="hljs-tag"></<span class="hljs-title">property</span>></span>
        <span class="hljs-tag"><<span class="hljs-title">set</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"employees"</span> <span class="hljs-attribute">table</span>=<span class="hljs-value">"EMPLOYEE"</span> <span class="hljs-attribute">inverse</span>=<span class="hljs-value">"true"</span> <span class="hljs-attribute">lazy</span>=<span class="hljs-value">"true"</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">key</span>></span>
                <span class="hljs-tag"><<span class="hljs-title">column</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"COMPANY"</span> /></span>
            <span class="hljs-tag"></<span class="hljs-title">key</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">one-to-many</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"Employee"</span> /></span>
        <span class="hljs-tag"></<span class="hljs-title">set</span>></span>
    <span class="hljs-tag"></<span class="hljs-title">class</span>></span>
<span class="hljs-tag"></<span class="hljs-title">hibernate-mapping</span>></span></code>

继承关系树的根类对应一张表对应的Employee.hbm.xml的写法

Employee.hbm.xml

<code class=" hljs xml"><span class="hljs-pi"><?xml version="1.0"?></span>
<span class="hljs-doctype"><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"></span>
<span class="hljs-tag"><<span class="hljs-title">hibernate-mapping</span> <span class="hljs-attribute">package</span>=<span class="hljs-value">"com.dongecs.test1.pojo"</span>></span>
    <span class="hljs-comment"><!-- 利用discriminator-value默认 empType 的值为emp --></span>
    <span class="hljs-tag"><<span class="hljs-title">class</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"Employee"</span> <span class="hljs-attribute">table</span>=<span class="hljs-value">"EMPLOYEE"</span> <span class="hljs-attribute">discriminator-value</span>=<span class="hljs-value">"emp"</span>></span>
        <span class="hljs-tag"><<span class="hljs-title">id</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"id"</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"java.lang.Integer"</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">column</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"ID"</span> /></span>
            <span class="hljs-tag"><<span class="hljs-title">generator</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"native"</span> /></span>
        <span class="hljs-tag"></<span class="hljs-title">id</span>></span>
       <span class="hljs-comment"><!--用于识别此类的类别 --></span>
        <span class="hljs-tag"><<span class="hljs-title">discriminator</span> <span class="hljs-attribute">column</span>=<span class="hljs-value">"empType"</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"string"</span>/></span>

        <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"name"</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"java.lang.String"</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">column</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"NAME"</span> /></span>
        <span class="hljs-tag"></<span class="hljs-title">property</span>></span>
        <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"age"</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"java.lang.Integer"</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">column</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"AGE"</span> /></span>
        <span class="hljs-tag"></<span class="hljs-title">property</span>></span>
        <span class="hljs-tag"><<span class="hljs-title">many-to-one</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"company"</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"Company"</span> <span class="hljs-attribute">fetch</span>=<span class="hljs-value">"join"</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">column</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"COMPANY"</span> /></span>
        <span class="hljs-tag"></<span class="hljs-title">many-to-one</span>></span>
       <span class="hljs-comment"><!--  若为DayEmployee,那么将empType的值设为DE --></span>
        <span class="hljs-tag"><<span class="hljs-title">subclass</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"DayEmployee"</span> <span class="hljs-attribute">discriminator-value</span>=<span class="hljs-value">"DE"</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"dayMoney"</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"double"</span>></span><span class="hljs-tag"></<span class="hljs-title">property</span>></span>
        <span class="hljs-tag"></<span class="hljs-title">subclass</span>></span>
         <span class="hljs-comment"><!--  若为MonthEmploy,那么将empType的值设为ME --></span>
        <span class="hljs-tag"><<span class="hljs-title">subclass</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"MonthEmploy"</span> <span class="hljs-attribute">discriminator-value</span>=<span class="hljs-value">"ME"</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"monthMoney"</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"double"</span>></span><span class="hljs-tag"></<span class="hljs-title">property</span>></span>
        <span class="hljs-tag"></<span class="hljs-title">subclass</span>></span>
    <span class="hljs-tag"></<span class="hljs-title">class</span>></span>
<span class="hljs-tag"></<span class="hljs-title">hibernate-mapping</span>></span>
</code>

利用上述代码作如下测试:

<code class=" hljs java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">EmployeeTest</span> {</span>

    SessionFactory sessionFactory = <span class="hljs-keyword">null</span>;
    Session session = <span class="hljs-keyword">null</span>;
    Transaction transaction = <span class="hljs-keyword">null</span>;

    <span class="hljs-annotation">@Before</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">init</span>() {
        Configuration configuration = <span class="hljs-keyword">new</span> Configuration().configure();
        ServiceRegistry serviceRegistry = <span class="hljs-keyword">new</span> ServiceRegistryBuilder().applySettings(configuration.getProperties())
                .buildServiceRegistry();
        sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        session = sessionFactory.openSession();
        transaction = session.beginTransaction();
    }

    <span class="hljs-annotation">@After</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">after</span>() {
        transaction.commit();
        session.close();
        sessionFactory.close();
    }

    <span class="hljs-annotation">@Test</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">testEmployee</span>() {
        Company company = <span class="hljs-keyword">new</span> Company(<span class="hljs-string">"com1"</span>);

        DayEmployee d1 = <span class="hljs-keyword">new</span> DayEmployee();
        d1.setAge(<span class="hljs-number">22</span>);
        d1.setDayMoney(<span class="hljs-number">50.0</span>);
        d1.setName(<span class="hljs-string">"d1"</span>);

        MonthEmploy d2 = <span class="hljs-keyword">new</span> MonthEmploy();
        d2.setAge(<span class="hljs-number">30</span>);
        d2.setMonthMoney(<span class="hljs-number">79.0</span>);
        d2.setName(<span class="hljs-string">"d2"</span>);

        Employee employee = <span class="hljs-keyword">new</span> Employee();
        employee.setAge(<span class="hljs-number">90</span>);
        employee.setName(<span class="hljs-string">"employee"</span>);

        d1.setCompany(company);
        d2.setCompany(company);
        employee.setCompany(company);

        <span class="hljs-comment">//inverse = true 时可以关联, 当相对多出3条update,因此建议使用多的一端关联</span>
<span class="hljs-comment">//      company.getEmployees().add(employee);</span>
<span class="hljs-comment">//      company.getEmployees().add(d1);</span>
<span class="hljs-comment">//      company.getEmployees().add(d2);</span>

        <span class="hljs-comment">//把一的一段放到最前保存,可以减小3条更新操作</span>
        session.save(company);

        session.save(employee);
        session.save(d2);
        session.save(d1);
    }
}</code>

会得出如下结果:
hibernate 映射继承关系

继承关系树的每个类对应一张表Employee.hbm.xml的写法

<code class=" hljs xml"><span class="hljs-pi"><?xml version="1.0"?></span>
<span class="hljs-doctype"><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"></span>
<span class="hljs-tag"><<span class="hljs-title">hibernate-mapping</span> <span class="hljs-attribute">package</span>=<span class="hljs-value">"com.dongecs.test1.pojo"</span>></span>
    <span class="hljs-tag"><<span class="hljs-title">class</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"Employee"</span> <span class="hljs-attribute">table</span>=<span class="hljs-value">"EMPLOYEE"</span>></span>
        <span class="hljs-tag"><<span class="hljs-title">id</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"id"</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"java.lang.Integer"</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">column</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"ID"</span> /></span>
            <span class="hljs-tag"><<span class="hljs-title">generator</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"native"</span> /></span>
        <span class="hljs-tag"></<span class="hljs-title">id</span>></span>

        <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"name"</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"java.lang.String"</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">column</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"NAME"</span> /></span>
        <span class="hljs-tag"></<span class="hljs-title">property</span>></span>
        <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"age"</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"java.lang.Integer"</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">column</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"AGE"</span> /></span>
        <span class="hljs-tag"></<span class="hljs-title">property</span>></span>
        <span class="hljs-tag"><<span class="hljs-title">many-to-one</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"company"</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"Company"</span> <span class="hljs-attribute">fetch</span>=<span class="hljs-value">"join"</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">column</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"COMPANY"</span> /></span>
        <span class="hljs-tag"></<span class="hljs-title">many-to-one</span>></span>
        <span class="hljs-comment"><!--   利用joined-subclass表签外键关联MonthEmploy --></span>
        <span class="hljs-tag"><<span class="hljs-title">joined-subclass</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"MonthEmploy"</span> <span class="hljs-attribute">table</span>=<span class="hljs-value">"MONEMPLOY"</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">key</span> <span class="hljs-attribute">column</span>=<span class="hljs-value">"EMPLOYEE_ID"</span>></span><span class="hljs-tag"></<span class="hljs-title">key</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"monthMoney"</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"double"</span>></span><span class="hljs-tag"></<span class="hljs-title">property</span>></span>
        <span class="hljs-tag"></<span class="hljs-title">joined-subclass</span>></span>
        <span class="hljs-tag"><<span class="hljs-title">joined-subclass</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"DayEmployee"</span> <span class="hljs-attribute">table</span>=<span class="hljs-value">"DAYEMPLOY"</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">key</span> <span class="hljs-attribute">column</span>=<span class="hljs-value">"EMPLOYEE_ID"</span>></span><span class="hljs-tag"></<span class="hljs-title">key</span>></span>
            <span class="hljs-tag"><<span class="hljs-title">property</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"dayMoney"</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"double"</span>></span><span class="hljs-tag"></<span class="hljs-title">property</span>></span>
        <span class="hljs-tag"></<span class="hljs-title">joined-subclass</span>></span>
    <span class="hljs-tag"></<span class="hljs-title">class</span>></span>
<span class="hljs-tag"></<span class="hljs-title">hibernate-mapping</span>></span></code>

测试代码:

<code class=" hljs java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">EmployeeTest</span> {</span>

    SessionFactory sessionFactory = <span class="hljs-keyword">null</span>;
    Session session = <span class="hljs-keyword">null</span>;
    Transaction transaction = <span class="hljs-keyword">null</span>;

    <span class="hljs-annotation">@Before</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">init</span>() {
        Configuration configuration = <span class="hljs-keyword">new</span> Configuration().configure();
        ServiceRegistry serviceRegistry = <span class="hljs-keyword">new</span> ServiceRegistryBuilder().applySettings(configuration.getProperties())
                .buildServiceRegistry();
        sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        session = sessionFactory.openSession();
        transaction = session.beginTransaction();
    }

    <span class="hljs-annotation">@After</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">after</span>() {
        transaction.commit();
        session.close();
        sessionFactory.close();
    }

    <span class="hljs-annotation">@Test</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">testEmployee</span>() {
        Company company = <span class="hljs-keyword">new</span> Company(<span class="hljs-string">"com1"</span>);

        DayEmployee d1 = <span class="hljs-keyword">new</span> DayEmployee();
        d1.setAge(<span class="hljs-number">22</span>);
        d1.setDayMoney(<span class="hljs-number">50.0</span>);
        d1.setName(<span class="hljs-string">"d1"</span>);

        MonthEmploy d2 = <span class="hljs-keyword">new</span> MonthEmploy();
        d2.setAge(<span class="hljs-number">30</span>);
        d2.setMonthMoney(<span class="hljs-number">79.0</span>);
        d2.setName(<span class="hljs-string">"d2"</span>);

        Employee employee = <span class="hljs-keyword">new</span> Employee();
        employee.setAge(<span class="hljs-number">90</span>);
        employee.setName(<span class="hljs-string">"employee"</span>);

        d1.setCompany(company);
        d2.setCompany(company);
        employee.setCompany(company);

        <span class="hljs-comment">//inverse = true 时可以关联, 当相对多出3条update,因此建议使用多的一端关联</span>
<span class="hljs-comment">//      company.getEmployees().add(employee);</span>
<span class="hljs-comment">//      company.getEmployees().add(d1);</span>
<span class="hljs-comment">//      company.getEmployees().add(d2);</span>

        <span class="hljs-comment">//把一的一段放到最前保存,可以减小3条更新操作</span>
        session.save(company);

        session.save(employee);
        session.save(d2);
        session.save(d1);
    }

    <span class="hljs-annotation">@Test</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">findFromEmployeeTable</span>(){
        String hql = <span class="hljs-string">"from Employee"</span>;
        <span class="hljs-comment">//通过左外链接找</span>
        List<Employee> list = session.createQuery(hql).list();
        <span class="hljs-keyword">for</span> (Employee emp : list){
            <span class="hljs-keyword">if</span> (emp <span class="hljs-keyword">instanceof</span> DayEmployee){
                System.out.println(<span class="hljs-string">"day"</span>);
            } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (emp <span class="hljs-keyword">instanceof</span> MonthEmploy){
                System.out.println(<span class="hljs-string">"mon"</span>);
            } <span class="hljs-keyword">else</span> {
                System.out.println(<span class="hljs-string">"emp"</span>);
            }
        }
    }

    <span class="hljs-annotation">@Test</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">findFromDayEmployeeTable</span>(){
        String hql = <span class="hljs-string">"from DayEmployee"</span>;
        <span class="hljs-comment">//通过内连接找</span>
        List<Employee> list = session.createQuery(hql).list();
        System.out.println(list.size());
    }
}
</code>

得出如下结果:
hibernate 映射继承关系
hibernate 映射继承关系

结论:

1.使用根类对应一张表
好处:只需创建一张表,不用外键关联
缺点:如果子类属性多,会导致另一子类有过多的空值,而且不能设置一些字段的not null约束,因此不能保证数据库的完整性
2.每个类对应一张表(外键关联)
好处:如果某个类的属性发生变化,只需修改和这个类对应的表
缺点:利用外键关联查询

ref:

孙卫琴.精通Hibernate:Java对象持久化技术详解

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
SpringBoot项目里怎么集成HibernateSpringBoot项目里怎么集成HibernateMay 18, 2023 am 09:49 AM

在SpringBoot项目中集成Hibernate前言Hibernate是一个流行的ORM(对象关系映射)框架,它可以将Java对象映射到数据库表,从而方便地进行持久化操作。在SpringBoot项目中,集成Hibernate可以帮助我们更轻松地进行数据库操作,本文将介绍如何在SpringBoot项目中集成Hibernate,并提供相应的示例。1.引入依赖在pom.xml文件中引入以下依赖:org.springframework.bootspring-boot-starter-data-jpam

Java JPA 面试题精选:检验你的持久化框架掌握程度Java JPA 面试题精选:检验你的持久化框架掌握程度Feb 19, 2024 pm 09:12 PM

什么是JPA?它与JDBC有什么区别?JPA(JavaPersistenceapi)是一个用于对象关系映射(ORM)的标准接口,它允许Java开发者使用熟悉的Java对象来操作数据库,而无需编写直接针对数据库的sql查询。而JDBC(JavaDatabaseConnectivity)是Java用于连接数据库的标准API,它需要开发者使用SQL语句来操作数据库。JPA将JDBC封装起来,为对象-关系映射提供了更方便、更高级别的API,简化了数据访问操作。在JPA中,什么是实体(Entity)?实体

如何在PHP中使用多态和继承来处理数据类型如何在PHP中使用多态和继承来处理数据类型Jul 15, 2023 pm 07:41 PM

如何在PHP中使用多态和继承来处理数据类型引言:在PHP中,多态和继承是两个重要的面向对象编程(OOP)概念。通过使用多态和继承,我们可以更加灵活地处理不同的数据类型。本文将介绍如何在PHP中使用多态和继承来处理数据类型,并通过代码示例展示它们的实际应用。一、继承的基本概念继承是面向对象编程中的一种重要概念,它允许我们创建一个类,该类可以继承父类的属性和方法

Java错误:Hibernate错误,如何处理和避免Java错误:Hibernate错误,如何处理和避免Jun 25, 2023 am 09:09 AM

Java是一种面向对象编程语言,它被广泛地应用于软件开发领域。Hibernate是一种流行的Java持久化框架,它提供了一种简单且高效的方式来管理Java对象的持久化。然而,开发过程中经常会遇到Hibernate错误,这些错误可能会导致程序的异常终止或者不稳定。如何处理和避免Hibernate错误成为了Java开发者必须掌握的能力。本文将介绍一些常见的Hib

hibernate和mybatis有哪些区别hibernate和mybatis有哪些区别Jan 03, 2024 pm 03:35 PM

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。详细介绍:1、实现方式,Hibernate是一个完整的对象/关系映射解决方案,将对象与数据库表进行映射,MyBatis则需要开发者手动编写SQL语句以及ResultMap;2、性能,Hibernate在开发速度上可能比MyBatis快,因为Hibernate简化了DAO层等等。

Java Hibernate中一对多和多对多关系的映射方式是什么Java Hibernate中一对多和多对多关系的映射方式是什么May 27, 2023 pm 05:06 PM

Hibernate的一对多和多对多Hibernate是一个优秀的ORM框架,它简化了Java应用程序与关系型数据库之间的数据访问。在Hibernate中,我们可以使用一对多和多对多的关系来处理复杂的数据模型。Hibernate的一对多在Hibernate中,一对多关系是指一个实体类对应多个另一个实体类。比如,一个订单(Order)可以对应多个订单项(OrderItem),一个用户(User)可以对应多个订单(Order)。要在Hibernate中实现一对多关系,需要在实体类中定义一个集合属性来存

如何在Go语言中实现封装和继承如何在Go语言中实现封装和继承Jul 23, 2023 pm 08:17 PM

如何在Go语言中实现封装和继承封装和继承是面向对象编程中的两个重要概念,它们可以使代码更加模块化和可维护,同时也为代码的复用提供了便利。本文将介绍在Go语言中如何实现封装和继承,并提供相应的代码示例。封装封装是将数据和功能进行封装,隐藏实现的细节,只暴露必要的接口给外部使用。在Go语言中,封装是通过导出和非导出标识符来实现的。首字母大写的标识符可以被其他包访

继承、多态与接口:PHP面向对象的三大特性继承、多态与接口:PHP面向对象的三大特性May 11, 2023 pm 03:45 PM

PHP是一种服务器端编程语言,自PHP5之后开始支持面向对象编程(OOP)。OOP的核心思想是将数据和行为封装在对象中,以提高程序的可维护性和可扩展性。在PHP中,面向对象编程具有三大特性:继承、多态与接口。一、继承继承是指一个类可以从另一个类中继承属性和方法。被继承的类称为父类或基类,继承的类称为子类或派生类。子类可以通过继承获得父类中的属性和方法,并且可

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),