hibernate 单向多对一关联映射 (many-to-one)XML 与注解版

509 阅读13分钟
原文链接: blog.csdn.net

多对一关联映射原理: 


在多的(组)一端加入一个外键,指向一(用户)的一端,映射完成之后使得加载多的一端数据的同时能把关联的一的一端的数据加载上来。




两个类实现多对一的关联映射步骤:


SQL文件:

  1. DROP TABLE IF EXISTS `groups`;  
  2. CREATE TABLE `groups` (  
  3.   `id` varchar(255) NOT NULL,  
  4.   `gname` varchar(255) DEFAULT NULL,  
  5.   PRIMARY KEY (`id`)  
  6. ENGINE=InnoDB DEFAULT CHARSET=utf8;  
  7.   
  8. DROP TABLE IF EXISTS `user`;  
  9. CREATE TABLE `user` (  
  10.   `id` varchar(255) NOT NULL,  
  11.   `name` varchar(255) DEFAULT NULL,  
  12.   `groupid` varchar(255) DEFAULT NULL,  
  13.   PRIMARY KEY (`id`)  
  14. ENGINE=InnoDB DEFAULT CHARSET=utf8;  
DROP TABLE IF EXISTS `groups`;
CREATE TABLE `groups` (
  `id` varchar(255) NOT NULL,
  `gname` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` varchar(255) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `groupid` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

(1)XML版


User类作为一的一端,则需要加入一个Group作为外键

  1. package Hibernate_demo1.Demo5.Entity;  
  2.   
  3. public class User {  
  4.       
  5.     private String id;    
  6.       
  7.         private String name;    
  8.         
  9.         private Group group;  
  10.       
  11.       
  12.   
  13.     public Group getGroup() {  
  14.         return group;  
  15.     }  
  16.   
  17.     public void setGroup(Group group) {  
  18.         this.group = group;  
  19.     }  
  20.   
  21.     public String getId() {    
  22.         return id;    
  23.     }    
  24.     
  25.     public void setId(String id) {    
  26.         this.id = id;    
  27.     }    
  28.     
  29.     public String getName() {    
  30.         return name;    
  31.     }    
  32.     
  33.     public void setName(String name) {    
  34.         this.name = name;    
  35.     }    
  36.     
  37. }  
package Hibernate_demo1.Demo5.Entity;

public class User {
	
	private String id;  
    
        private String name;  
      
        private Group group;
    
    

	public Group getGroup() {
		return group;
	}

	public void setGroup(Group group) {
		this.group = group;
	}

	public String getId() {  
        return id;  
    }  
  
    public void setId(String id) {  
        this.id = id;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
}

Group类作为多的一端:

  1. package Hibernate_demo1.Demo5.Entity;  
  2.   
  3. public class Group {  
  4.       
  5.         private String id;    
  6.             
  7.         private String gname;    
  8.         
  9.   
  10.   
  11.         public String getId() {  
  12.             return id;  
  13.         }  
  14.   
  15.         public void setId(String id) {  
  16.             this.id = id;  
  17.         }  
  18.   
  19.         public String getGname() {  
  20.             return gname;  
  21.         }  
  22.   
  23.         public void setGname(String gname) {  
  24.             this.gname = gname;  
  25.         }  
  26.   
  27. }  
package Hibernate_demo1.Demo5.Entity;

public class Group {
	
	    private String id;  
	      
	    private String gname;  
	  


		public String getId() {
			return id;
		}

		public void setId(String id) {
			this.id = id;
		}

		public String getGname() {
			return gname;
		}

		public void setGname(String gname) {
			this.gname = gname;
		}

}

User类的映射配置如下:

  1. <?xml version="1.0"?>    
  2. <!DOCTYPE hibernate-mapping PUBLIC     
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">    
  5. <hibernate-mapping>  
  6. <class name="Hibernate_demo1.Demo5.Entity.User"  table="User" lazy="false">  
  7.     <id name="id"  column="id">  
  8.         <generator class="uuid"  />  
  9.     </id>  
  10.     <property name="name"  column="name"/>  
  11.     <many-to-one name="group"  column="groupid"/>  
  12. </class>  
  13. </hibernate-mapping>  
<?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="Hibernate_demo1.Demo5.Entity.User" table="User" lazy="false">
	<id name="id" column="id">
	    <generator class="uuid" />
	</id>
	<property name="name" column="name"/>
	<many-to-one name="group" column="groupid"/>
</class>
</hibernate-mapping>

Group类的映射配置如下:

  1. <?xml version="1.0"?>    
  2. <!DOCTYPE hibernate-mapping PUBLIC     
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">    
  5. <hibernate-mapping>  
  6. <class name="Hibernate_demo1.Demo5.Entity.Group"  table="Groups" >  
  7.         <id name="id"  column="id" >  
  8.             <generator class= "uuid" />  
  9.         </id>  
  10.         <property name="gname"  column="gname" type="string"  />          
  11. </class>  
  12. </hibernate-mapping>  
<?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="Hibernate_demo1.Demo5.Entity.Group" table="Groups" >
		<id name="id" column="id" >
			<generator class="uuid" />
		</id>
		<property name="gname" column="gname" type="string" />		
</class>
</hibernate-mapping>

从上面的两个配置文件可以看出,多对一的关联映射只需要在一的一端配置一个<many-to-one>标签就可以了,如上面User类的配置生成的表的user为指向多的一端的外键。


测试类如下:

  1. package Hibernate_demo1.Demo5;  
  2.   
  3. import org.hibernate.Session;  
  4. import org.hibernate.SessionFactory;  
  5. import org.hibernate.Transaction;  
  6. import org.hibernate.cfg.Configuration;  
  7.   
  8. import Hibernate_demo1.Demo5.Entity.Group;  
  9. import Hibernate_demo1.Demo5.Entity.User;  
  10. import Hibernate_demo1.Demo5.Util.HibernateUtils;  
  11.   
  12.   
  13. public class App   
  14. {  
  15.     public static void main( String[] args )  
  16.     {  
  17.         Session session = null;  
  18.   
  19.         try{    
  20.             
  21.             session = HibernateUtils.getSession();  
  22.             session.beginTransaction();    
  23.                 
  24.   
  25.   
  26.             Group answer = new Group();  
  27.             answer.setGname("JAVA");  
  28.             session.save(answer);  
  29.               
  30.             User user = new User();  
  31.             user.setName("fendo");  
  32.             user.setGroup(answer);  
  33.               
  34.               
  35.             User user1 = new User();  
  36.             user1.setName("admin");  
  37.             user1.setGroup(answer);  
  38.               
  39.             session.save(user);  
  40.             session.save(user1);  
  41.                 
  42.             session.getTransaction().commit();    
  43.         }catch(Exception e){    
  44.             e.printStackTrace();    
  45.             session.getTransaction().rollback();    
  46.         }finally{    
  47.             HibernateUtils.closeSession(session);    
  48.         }  
  49.     }  
  50. }  
package Hibernate_demo1.Demo5;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import Hibernate_demo1.Demo5.Entity.Group;
import Hibernate_demo1.Demo5.Entity.User;
import Hibernate_demo1.Demo5.Util.HibernateUtils;


public class App 
{
    public static void main( String[] args )
    {
    	Session session = null;

    	try{  
  		  
    	    session = HibernateUtils.getSession();
    	    session.beginTransaction();  
    	      


        	Group answer = new Group();
        	answer.setGname("JAVA");
        	session.save(answer);
        	
        	User user = new User();
        	user.setName("fendo");
        	user.setGroup(answer);
        	
        	
        	User user1 = new User();
        	user1.setName("admin");
        	user1.setGroup(answer);
        	
        	session.save(user);
        	session.save(user1);
    	      
    	    session.getTransaction().commit();  
    	}catch(Exception e){  
    	    e.printStackTrace();  
    	    session.getTransaction().rollback();  
    	}finally{  
    	    HibernateUtils.closeSession(session);  
    	}
    }
}


执行结果如下:

  1. Hibernate:   
  2.     insert   
  3.     into  
  4.         Groups  
  5.         (gname, id)   
  6.     values  
  7.         (?, ?)  
  8. Hibernate:   
  9.     insert   
  10.     into  
  11.         User  
  12.         (name, groupid, id)   
  13.     values  
  14.         (?, ?, ?)  
  15. Hibernate:   
  16.     insert   
  17.     into  
  18.         User  
  19.         (name, groupid, id)   
  20.     values  
  21.         (?, ?, ?)  
Hibernate: 
    insert 
    into
        Groups
        (gname, id) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        User
        (name, groupid, id) 
    values
        (?, ?, ?)
Hibernate: 
    insert 
    into
        User
        (name, groupid, id) 
    values
        (?, ?, ?)


示例:download.csdn.net/detail/u011…


(2)注解版



Group

  1. package Hibernate_demo1.Demo6.Entity;  
  2.   
  3. import javax.persistence.Column;  
  4. import javax.persistence.Entity;  
  5. import javax.persistence.GeneratedValue;  
  6. import javax.persistence.Id;  
  7. import javax.persistence.Table;  
  8.   
  9. import org.hibernate.annotations.GenericGenerator;  
  10.   
  11. @Entity  
  12. @Table(name = "Groups")  
  13. public class Group {  
  14.       
  15.         @Id  
  16.         @Column(name="id")  
  17.         @GenericGenerator(name="uuidGenerator",strategy= "uuid")  
  18.         @GeneratedValue(generator="uuidGenerator")  
  19.         private String id;    
  20.             
  21.         @Column(name = "gname")  
  22.         private String gname;    
  23.         
  24.   
  25.         public String getId() {  
  26.             return id;  
  27.         }  
  28.   
  29.         public void setId(String id) {  
  30.             this.id = id;  
  31.         }  
  32.   
  33.         public String getGname() {  
  34.             return gname;  
  35.         }  
  36.   
  37.         public void setGname(String gname) {  
  38.             this.gname = gname;  
  39.         }  
  40.   
  41. }  
package Hibernate_demo1.Demo6.Entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name = "Groups")
public class Group {
	
	    @Id
	    @Column(name="id")
	    @GenericGenerator(name="uuidGenerator",strategy="uuid")
	    @GeneratedValue(generator="uuidGenerator")
	    private String id;  
	      
	    @Column(name = "gname")
	    private String gname;  
	  

		public String getId() {
			return id;
		}

		public void setId(String id) {
			this.id = id;
		}

		public String getGname() {
			return gname;
		}

		public void setGname(String gname) {
			this.gname = gname;
		}

}

User

  1. package Hibernate_demo1.Demo6.Entity;  
  2.   
  3. import javax.persistence.Column;  
  4. import javax.persistence.Entity;  
  5. import javax.persistence.GeneratedValue;  
  6. import javax.persistence.GenerationType;  
  7. import javax.persistence.Id;  
  8. import javax.persistence.JoinColumn;  
  9. import javax.persistence.ManyToOne;  
  10. import javax.persistence.SequenceGenerator;  
  11. import javax.persistence.Table;  
  12.   
  13. import org.hibernate.annotations.GenericGenerator;  
  14.   
  15. @Entity  
  16. @Table(name = "User")  
  17. public class User {  
  18.       
  19.         @Id  
  20.         @Column(name="id")  
  21.         @GenericGenerator(name="uuidGenerator",strategy= "uuid")  
  22.         @GeneratedValue(generator="uuidGenerator")  
  23.     private String id;    
  24.       
  25.         @Column(name = "name")  
  26.         private String name;    
  27.         
  28.         @ManyToOne()  
  29.         @JoinColumn(name = "groupid")  
  30.         private Group group;  
  31.       
  32.       
  33.     public Group getGroup() {  
  34.         return group;  
  35.     }  
  36.   
  37.     public void setGroup(Group group) {  
  38.         this.group = group;  
  39.     }  
  40.   
  41.     public String getId() {    
  42.         return id;    
  43.     }    
  44.     
  45.     public void setId(String id) {    
  46.         this.id = id;    
  47.     }    
  48.     
  49.     public String getName() {    
  50.         return name;    
  51.     }    
  52.     
  53.     public void setName(String name) {    
  54.         this.name = name;    
  55.     }    
  56.     
  57. }  
package Hibernate_demo1.Demo6.Entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name = "User")
public class User {
	
        @Id
        @Column(name="id")
        @GenericGenerator(name="uuidGenerator",strategy="uuid")
        @GeneratedValue(generator="uuidGenerator")
	private String id;  
    
        @Column(name = "name")
        private String name;  
      
        @ManyToOne()
        @JoinColumn(name = "groupid")
        private Group group;
    
    
	public Group getGroup() {
		return group;
	}

	public void setGroup(Group group) {
		this.group = group;
	}

	public String getId() {  
        return id;  
    }  
  
    public void setId(String id) {  
        this.id = id;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
}

测试类:

  1. public class App   
  2. {  
  3.     public static void main( String[] args )  
  4.     {  
  5.         SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();    
  6.         Session session = sessionFactory.getCurrentSession();    
  7.         Transaction tx = session.beginTransaction();    
  8.           
  9.         Group grp=new Group();  
  10.         grp.setGname("fendo");  
  11.           
  12.         session.save(grp);  
  13.           
  14.         User use1=new User();  
  15.         use1.setName("JAVA");  
  16.         use1.setGroup(grp);  
  17.           
  18.         User user2=new User();  
  19.         user2.setName("C++");  
  20.         user2.setGroup(grp);  
  21.           
  22.         session.save(use1);  
  23.         session.save(user2);  
  24.         tx.commit();  
  25.         session.close();  
  26.     }  
  27. }  
public class App 
{
    public static void main( String[] args )
    {
    	SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();  
    	Session session = sessionFactory.getCurrentSession();  
    	Transaction tx = session.beginTransaction();  
        
        Group grp=new Group();
        grp.setGname("fendo");
        
        session.save(grp);
        
        User use1=new User();
        use1.setName("JAVA");
        use1.setGroup(grp);
        
        User user2=new User();
        user2.setName("C++");
        user2.setGroup(grp);
        
        session.save(use1);
        session.save(user2);
        tx.commit();
        session.close();
    }
}

执行结果为:

  1. Hibernate:   
  2.     insert   
  3.     into  
  4.         Groups  
  5.         (gname, id)   
  6.     values  
  7.         (?, ?)  
  8. Hibernate:   
  9.     insert   
  10.     into  
  11.         User  
  12.         (groupid, name, id)   
  13.     values  
  14.         (?, ?, ?)  
  15. Hibernate:   
  16.     insert   
  17.     into  
  18.         User  
  19.         (groupid, name, id)   
  20.     values  
  21.         (?, ?, ?)  
Hibernate: 
    insert 
    into
        Groups
        (gname, id) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        User
        (groupid, name, id) 
    values
        (?, ?, ?)
Hibernate: 
    insert 
    into
        User
        (groupid, name, id) 
    values
        (?, ?, ?)

示例:download.csdn.net/detail/u011…