Hibernate从入门到精通(4)- 单向 一对多 多对一

Hibernate单向操作

下面使用学生-班级进行测试:

一对多(班级-学生)

班级影响学生,学生不影响班级。

映射

hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="hibernate.connection.password">xukai</property>
        <property name="hibernate.connection.url">jdbc:oracle:thin:@10.25.116.164:1521:orcl</property>
        <property name="hibernate.connection.username">xukai</property>
        <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
    
    	<!-- <property name="hibernate.hbm2ddl.auto">create</property> -->
    	<property name="hibernate.show_sql">true</property>
    	<property name="hibernate.format_sql">true</property>

	<mapping resource="com/edu/entity/Student.hbm.xml"/>
	<mapping resource="com/edu/entity/ClassInfo.hbm.xml"/>
    </session-factory>
</hibernate-configuration>
 ClassInfo和Student实体类:
package com.edu.entity;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class ClassInfo implements Serializable{
	
	private static final long serialVersionUID = 1L;

	private Integer claId;
	
	private String claName;

	//班级下面的学生
	private Set<Student> stus = new HashSet<>();

	//getter.setter
}


package com.edu.entity;

import java.io.Serializable;

public class Student implements Serializable {

	private static final long serialVersionUID = 1L;

	private Integer stuId;
	
	private String stuName;	<pre name="code" class="java" style="font-size: 13.3333339691162px;"><span style="white-space:pre">	</span>//getter.setter
}
 
  
ClassInfo.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2015-10-29 20:52:31 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.edu.entity.ClassInfo" table="CLASSINFO">
        <id name="claId" type="java.lang.Integer">
            <column name="CLA_ID" />
            <generator class="assigned" />
        </id>
        <property name="claName" type="java.lang.String">
            <column name="CLA_NAME" />
        </property>
        <set name="stus" table="STUDENT" inverse="false" lazy="false" 
        	cascade="save-update">
        	<key>
        		<!-- STUDENT表中的外键列名 -->
        		<column name="CLA_ID"></column>
        	</key>
        	<one-to-many class="com.edu.entity.Student"/>
        </set>
    </class>
</hibernate-mapping>

Student.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2015-10-29 20:52:31 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.edu.entity.Student" table="STUDENT">
        <id name="stuId" type="java.lang.Integer">
            <column name="STU_ID" />
            <generator class="assigned" />
        </id>
        <property name="stuName" type="java.lang.String">
            <column name="STU_NAME" />
        </property>
    </class>
</hibernate-mapping>

测试:执行完毕说明,配置没有问题。
HibernateUtil:
package com.edu.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;

public class HibernateUtils {

	private static SessionFactory sessionFactory;
	
	static{
		Configuration config = new Configuration().configure();
		ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
				.applySettings(config.getProperties()).build();
		sessionFactory = config.buildSessionFactory(serviceRegistry);
		System.out.println("资源加载成功!");
	}
	
	public static Session getSession(){
		return sessionFactory.openSession();
	}
	
	public static void closeSession(Session session){
		if(session != null && session.isOpen()){
			session.close();
		}
	}
	
}
使用JUnit进行测试:
package com.edu.util;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.edu.entity.ClassInfo;
import com.edu.entity.Student;

public class HibernateUtilsTest {

	private Session session = null;
	private Transaction tran = null;
	
	@Before
	public void initSession(){
		session = HibernateUtils.getSession();
		tran = session.beginTransaction();
	}
	
	@Test
	public void testGet(){
		ClassInfo classInfo = (ClassInfo) session.get(ClassInfo.class, 10);
		session.close();
		System.out.println(classInfo.toString());

	}
	
	@Test
	public void testSave(){
		Student stu1 = new Student();
		stu1.setStuId(1);
		stu1.setStuName("学生1");
		Student stu2 = new Student();
		stu2.setStuId(2);
		stu2.setStuName("学生2");
		
		ClassInfo classInfo = new ClassInfo();
		classInfo.setClaId(10);
		classInfo.setClaName("十班");
		classInfo.getStus().add(stu1);
		classInfo.getStus().add(stu2);
		session.save(classInfo);
	}
	
	@After
	public void colseSession(){
		if(tran!=null){
			tran.commit();
		}
		if(session!=null&&session.isOpen()){
			session.close();
		}
	}
	
}

注解(Annotation)

hibernate.cfg.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="hibernate.connection.password">xukai</property>
        <property name="hibernate.connection.url">jdbc:oracle:thin:@10.25.116.164:1521:orcl</property>
        <property name="hibernate.connection.username">xukai</property>
        <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
    
    	<!-- <property name="hibernate.hbm2ddl.auto">create</property> -->
    	<property name="hibernate.show_sql">true</property>
    	<property name="hibernate.format_sql">true</property>
<span style="white-space:pre">	</span><!-- 使用注解为class -->
	<mapping class="com.edu.entity.ClassInfo"/>
	<mapping class="com.edu.entity.Student"/>
		
    </session-factory>
</hibernate-configuration>
Student 实体类:
package com.edu.entity;

import java.io.Serializable;

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

@Entity
@Table(name="student")
public class Student implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@Column(name="STU_ID")
	private Integer stuId;
	
	@Column(name="STU_NAME")
	private String stuName;

	//getter setter
}
ClassInfo 实体类:
package com.edu.entity;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="CLASS_INFO")
public class ClassInfo implements Serializable{
	
	private static final long serialVersionUID = 1L;

	@Id
	@Column(name="CLA_ID")
	private Integer claId;
	
	@Column(name="CLA_NAME")
	private String claName;

	@OneToMany(targetEntity=Student.class,
			cascade=CascadeType.ALL)
	//外键
	@JoinColumn(name="CLA_ID")
	private Set<Student> stus = new HashSet<>();
	
	//getter setter
}

测试:
package com.edu.util;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.edu.entity.ClassInfo;
import com.edu.entity.Student;

public class HibernateUtilsTest {

	private Session session = null;
	private Transaction tran = null;
	
	@Before
	public void initSession(){
		session = HibernateUtils.getSession();
		tran = session.beginTransaction();
	}
	
	@Test
	public void testGet(){
		ClassInfo classInfo = (ClassInfo) session.get(ClassInfo.class, 10);
		System.out.println(classInfo.toString());
	}
	
	public void testSave(){
		Student stu1 = new Student();
		stu1.setStuId(1);
		stu1.setStuName("学生1");
		Student stu2 = new Student();
		stu2.setStuId(2);
		stu2.setStuName("学生2");
		
		ClassInfo classInfo = new ClassInfo();
		classInfo.setClaId(10);
		classInfo.setClaName("十班");
		classInfo.getStus().add(stu1);
		classInfo.getStus().add(stu2);
		session.save(classInfo);
	}
	
	@After
	public void colseSession(){
		if(tran!=null){
			tran.commit();
		}
		if(session!=null&&session.isOpen()){
			session.close();
		}
	}
	
}

多对一(学生-班级)

学生影响班级,班级不影响学生。

映射

hibernate.cfg.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="hibernate.connection.password">xukai</property>
        <property name="hibernate.connection.url">jdbc:oracle:thin:@10.25.116.164:1521:orcl</property>
        <property name="hibernate.connection.username">xukai</property>
        <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
    
    	<property name="hibernate.hbm2ddl.auto">create</property>
    	<property name="hibernate.show_sql">true</property>
    	<property name="hibernate.format_sql">true</property>

		<mapping resource="com/edu/entity/Student.hbm.xml"/>
		<mapping resource="com/edu/entity/ClassInfo.hbm.xml"/>
    </session-factory>
</hibernate-configuration>
Student 实体类:
package com.edu.entity;

import java.io.Serializable;

public class Student implements Serializable {

	private static final long serialVersionUID = 1L;

	private Integer stuId;
	
	private String stuName;
	
	private ClassInfo classInfo;//关联班级

<span style="white-space:pre">	</span>//getter setter
}
ClassInfo 实体类:
package com.edu.entity;

import java.io.Serializable;

public class ClassInfo implements Serializable{

	private static final long serialVersionUID = 1L;

	private Integer claId;
	
	private String claName;

<span style="white-space:pre">	</span>//getter setter
}
Student.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2015-10-29 21:19:46 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.edu.entity.Student" table="STUDENT">
        <id name="stuId" type="java.lang.Integer">
            <column name="STUID" />
            <generator class="assigned" />
        </id>
        <property name="stuName" type="java.lang.String">
            <column name="STUNAME" />
        </property>
        <many-to-one name="classInfo" class="com.edu.entity.ClassInfo" fetch="join"
			cascade="save-update">
			<!-- STUDENT表中的外键列名 -->
            <column name="CLA_ID" />
        </many-to-one>
    </class>
</hibernate-mapping>
ClassInfo.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2015-10-29 21:19:46 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="com.edu.entity.ClassInfo" table="CLASSINFO">
        <id name="claId" type="java.lang.Integer">
            <column name="CLAID" />
            <generator class="assigned" />
        </id>
        <property name="claName" type="java.lang.String">
            <column name="CLANAME" />
        </property>
    </class>
</hibernate-mapping>
测试:
package com.edu.util;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.edu.entity.ClassInfo;
import com.edu.entity.Student;

public class HibernateUtilsTest {

	private Session session = null;
	private Transaction tran = null;
	
	@Before
	public void initSession(){
		session = HibernateUtils.getSession();
		tran = session.beginTransaction();
	}
	
	@Test
	public void testSave(){
		ClassInfo classInfo = new ClassInfo();
		classInfo.setClaId(10);
		classInfo.setClaName("十班");
		Student stu1 = new Student();
		stu1.setStuId(1);
		stu1.setStuName("学生1");
		stu1.setClassInfo(classInfo);
		Student stu2 = new Student();
		stu2.setStuId(2);
		stu2.setStuName("学生2");
		stu2.setClassInfo(classInfo);
		session.save(stu1);
		session.save(stu2);
	}
	
	@After
	public void colseSession(){
		if(tran!=null){
			tran.commit();
		}
		if(session!=null&&session.isOpen()){
			session.close();
		}
	}
	
}

注解(Annotation)

hibernate.cfg.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="hibernate.connection.password">xukai</property>
        <property name="hibernate.connection.url">jdbc:oracle:thin:@10.25.116.164:1521:orcl</property>
        <property name="hibernate.connection.username">xukai</property>
        <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
    
    	<property name="hibernate.hbm2ddl.auto">create</property>
    	<property name="hibernate.show_sql">true</property>
    	<property name="hibernate.format_sql">true</property>

		<mapping class="com.edu.entity.Student"/>
		<mapping class="com.edu.entity.ClassInfo"/>
    </session-factory>
</hibernate-configuration>
Student:实体类:
package com.edu.entity;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="STUDENT")
public class Student implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@Column(name="STU_ID")
	private Integer stuId;
	
	@Column(name="STU_NAME")
	private String stuName;
	
	@ManyToOne(targetEntity=ClassInfo.class,cascade=CascadeType.ALL)
	@JoinColumn(name="CLA_ID")
	private ClassInfo classInfo;

	//getter setter
}
ClassInfo 实体类:
package com.edu.entity;

import java.io.Serializable;

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

@Entity
@Table(name="CLASS_INFO")
public class ClassInfo implements Serializable{

	private static final long serialVersionUID = 1L;

	@Id
	@Column(name="CLA_ID")
	private Integer claId;
	
	@Column(name="CLA_NAME")
	private String claName;

<span style="white-space:pre">	</span>//getter setter
}
测试类:
package com.edu.util;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.edu.entity.ClassInfo;
import com.edu.entity.Student;

public class HibernateUtilsTest {

	private Session session = null;
	private Transaction tran = null;
	
	@Before
	public void initSession(){
		session = HibernateUtils.getSession();
		tran = session.beginTransaction();
	}
	
	@Test
	public void testSave(){
		ClassInfo classInfo = new ClassInfo();
		classInfo.setClaId(10);
		classInfo.setClaName("十班");
		Student stu1 = new Student();
		stu1.setStuId(1);
		stu1.setStuName("学生1");
		stu1.setClassInfo(classInfo);
		Student stu2 = new Student();
		stu2.setStuId(2);
		stu2.setStuName("学生2");
		stu2.setClassInfo(classInfo);
		session.save(stu1);
		session.save(stu2);
	}
	
	@After
	public void colseSession(){
		if(tran!=null){
			tran.commit();
		}
		if(session!=null&&session.isOpen()){
			session.close();
		}
	}
	
}

总结:单向一对多在one的一方进行操作,多对一在many的一方进行操作。












  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值