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

多对一关联映射原理: 


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




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


SQL文件:

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作为外键

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类作为多的一端:

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类的映射配置如下:

<?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类的映射配置如下:

<?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为指向多的一端的外键。


测试类如下:

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);  
    	}
    }
}


执行结果如下:

Hibernate: 
    insert 
    into
        Groups
        (gname, id) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        User
        (name, groupid, id) 
    values
        (?, ?, ?)
Hibernate: 
    insert 
    into
        User
        (name, groupid, id) 
    values
        (?, ?, ?)


示例:http://download.csdn.net/detail/u011781521/9832546


(2)注解版



Group

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

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;  
    }  
  
}

测试类:

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();
    }
}

执行结果为:

Hibernate: 
    insert 
    into
        Groups
        (gname, id) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        User
        (groupid, name, id) 
    values
        (?, ?, ?)
Hibernate: 
    insert 
    into
        User
        (groupid, name, id) 
    values
        (?, ?, ?)

示例: http://download.csdn.net/detail/u011781521/9832632

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Hibernate是一个Java持久化框架,它能够将Java对象映射到数据库中的表格,同时支持各种关系数据库,如MySQL、Oracle等。在Hibernate中,对于一对一、一对多和多对多的关系,我们可以通过以下方式进行映射。 一对一关系:在Hibernate中,可以通过主键关联和外键关联来实现一对一关系的映射。主键关联是指两个实体之间的关联通过主键来进行,可以使用@PrimaryKeyJoinColumn注解将两个实体关联起来。外键关联是指通过一个实体引用另一个实体的主键作为外键,使用@JoinColumn注解来指定外键属性。 一对多关系:在Hibernate中,一对多关系通常通过外键关联来实现。在一的一方,使用@OneToMany注解来定义一对多关系,同时使用@JoinColumn注解指定外键属性。在多的一方,使用@ManyToOne注解来定义多对一关系,并使用@JoinColumn注解指定外键属性。 多对多关系:在Hibernate中,多对多关系通常通过中间表来实现。在多对多的两个实体中,使用@ManyToMany注解来定义多对多关系。同时,需要在中间表中创建两个外键,分别与两个实体的主键关联,并使用@JoinTable注解来指定中间表的表名和两个外键的列名。 总结:通过Hibernate注解方式,可以方便地实现一对一、一对多和多对多关系的映射。通过合理地使用注解,可以减少编写映射文件的工作量,提高开发效率。同时,Hibernate还提供了在运行时自动生成表结构的功能,可以根据Java实体类来动态创建或更新对应的数据库表格,从而提高系统的可维护性和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值