찾다
데이터 베이스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>

会得出如下结果:
这里写图片描述

继承关系树的每个类对应一张表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>

得出如下结果:
这里写图片描述
这里写图片描述

结论:

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)?实体

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

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

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

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

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层等等。

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

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

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

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

如何在Hibernate中执行批量插入更新操作?如何在Hibernate中执行批量插入更新操作?Aug 27, 2023 pm 11:17 PM

在本文中,我们将看到如何在Hibernate中执行批量插入/更新。每当我们执行一条sql语句时,我们都是通过对数据库进行网络调用来完成的。现在,如果我们必须向数据库表中插入10个条目,那么我们必须进行10次网络调用。相反,我们可以通过使用批处理来优化网络调用。批处理允许我们在单个网络调用中执行一组SQL语句。为了理解和实施这一点,让我们定义我们的实体−@EntitypublicclassParent{@Id@GeneratedValue(strategy=GenerationType.AUTO)

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구