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的一方进行操作。