Hibernate进修(四)多对一单向关联映射
当前位置:以往代写 > JAVA 教程 >Hibernate进修(四)多对一单向关联映射
2019-06-14

Hibernate进修(四)多对一单向关联映射

Hibernate进修(四)多对一单向关联映射

副标题#e#

Hibernate对付数据库的操纵,全部操作面向工具的思维来领略和实现的。一般的单独表的映射,相信各人都没有问题,可是对付一些表之间的非凡干系,Hibernate提供了一些奇特的方法去简化它。

本日就来说说多对一的关联映射。

数据库中有多对一的干系,Hibernate自然也有工具的多对一的关联干系。好比用户和用户组,一个用户只属于一个组,一个组有多名用户。我们就可以说用户和用户组的干系就是多对一的干系。用工具的uml图暗示一下:

Hibernate学习(四)多对一单向关联映射

在Hibernate中如何来实现呢?首先界说这两个实体类:

package com.bjpowernode.hibernate;  
      
/** 
 * 用户组 
 * @author Longxuan 
 * 
 */
public class Group {  
      
    private int id;  
    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;  
    }  
}  
      
      
      
package com.bjpowernode.hibernate;  
      
/** 
 * 用户类 
 * @author Longxuan 
 * 
 */
public class User {  
          
    private int  id;  
          
    private String name;  
      
    private Group group;  
          
    public Group getGroup() {  
        return group;  
    }  
      
    public void setGroup(Group group) {  
        this.group = group;  
    }  
      
    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;  
    }  
      
}

URL:http://www.bianceng.cn/Programming/Java/201410/45830.htm

hibernate.cfg.xml设置文件:

<!DOCTYPE hibernate-configuration PUBLIC  
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
      
<hibernate-configuration>  
    <session-factory name="foo">    
              
        <property name="hibernate.dialect" >org.hibernate.dialect.MySQLDialect</property>  
        <property name="hibernate.show_sql">true</property><!-- 配置是否显示生成sql语句 -->
        <property name="hibernate.format_sql">false</property><!-- 配置是否名目化sql语句-->
              
        <mapping resource="com/bjpowernode/hibernate/Tables.hbm.xml"  />  
    </session-factory>  
</hibernate-configuration>


#p#副标题#e#

hibernate.properties设置文件:

## MySQL  
      
hibernate.dialect org.hibernate.dialect.MySQLDialect  
#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect  
#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect  
hibernate.connection.driver_class com.mysql.jdbc.Driver  
hibernate.connection.url jdbc:mysql://localhost:3306/hibernate_many2one  
hibernate.connection.username root  
hibernate.connection.password root

这是最基本的筹备事情,多对一映射在对数据举办变动时,会有一些限制。当没有该用户组时,添加用户,就会堕落,当该用户组有用户时,删除该用户组也会报错。

我们虽然可以按一般的要领来做。添加的时候,先手动添加组,再添加用户。删除时,先删除所有的用户,再删除用户组。可是Hibernate为我们提供了一种便捷的方法——many-to-one。在映射文件hbm.xml中设置后,就可以不消再想那些限制了。Hibernate会自动添加上所引用的数据。

给出映射文件:

<?xml version="1.0"?>  
<!DOCTYPE hibernate-mapping PUBLIC   
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<hibernate-mapping>  
          
    <class name="com.bjpowernode.hibernate.User" table="t_user">  
        <id name="id">  
            <generator class="native"  />  
        </id>  
        <property name="name"></property>  
        <many-to-one name="group" column="groupid" cascade="save-update"></many-to-one>  
    </class>  
              
    <class name="com.bjpowernode.hibernate.Group" table="t_group">  
        <id name="id">  
            <generator class="native"  />  
        </id>  
        <property name="name"></property>  
    </class>  
          
</hibernate-mapping>

设置了many-to-one会自动在t_user表中建设外键groupid,与t_group的id映射。

Hibernate学习(四)多对一单向关联映射

#p#分页标题#e#

测试类Many2OneTest:

package com.bjpowernode.hibernate;  
      
import junit.framework.TestCase;  
      
import org.hibernate.Session;  
      
public class Many2OneTest extends TestCase {  
      
        /** 
         * 测试添加用户 
		 *URL:http://www.bianceng.cn/Programming/Java/201410/45830.htm
         */
        public void testSave3(){  
        Session session = null;  
        try{  
            session = HibernateUtils.getSession();  
            session.beginTransaction();  
                  
            Group group = new Group();  
            group.setName("提高班");  
                  
            User user1 = new User();  
            user1.setName("张三");  
            user1.setGroup(group);  
                  
            User user2 = new User();  
            user2.setName("李四");  
            user2.setGroup(group);  
                  
            //普通要领 :必需先生存group,再生存user  
            //设置了many-to-one 则不消再手动save group了。  
            //session.save(group);  
            session.save(user1);  
            session.save(user2);  
                  
            session.getTransaction().commit();  
        }catch(Exception e){  
            e.printStackTrace();  
            session.getTransaction().rollback();  
        }finally{  
            HibernateUtils.closeSession(session);  
        }  
    }  
          
}

#p#副标题#e#

功效图:

Hibernate学习(四)多对一单向关联映射

执行测试前:

Hibernate学习(四)多对一单向关联映射

, 执行测试后:

Hibernate学习(四)多对一单向关联映射

用many-to-one举办设置后,hibernate会自动去添加外键,而我们做的任何操纵都不需要去思量它的布局,也不消手动去维护这个干系,干系由Hibernate自动维护。这就是Hibernate的魅力地址。

    关键字:

在线提交作业