<pre name="code" class="java"><span style="color:#FF0000;">不维护关系那方@OneToMany(mappedBy="person"):在不维护关系那方添加这个Annotation;由我在对方的属性(字段)来维护。</span>
<span style="color:#FF0000;">@OneToMany(mappedBy="cla")//mappedBy="cla"让多的一方的cla属性来维护关系</span>
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!-- hibernate的方言,用来确定连接的数据库 --><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- 数据库的连接类 --><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><!-- 数据的连接字符串和用户名密码 --><property name="hibernate.connection.url">jdbc:mysql://localhost:3306/itat_hibernate</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">123</property><!-- 在使用hibernate时会显示SQL --><property name="show_sql">true</property><!-- 会自动完成类到数据表的转换 --><property name="hibernate.hbm2ddl.auto">update</property><!-- 加入实体类的映射文件 --><mapping class="org.com.test.model.User"/><mapping class="org.com.test.model.Student"/><mapping class="org.com.test.model.Classroom"/></session-factory></hibernate-configuration>
package org.com.test.model;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
@Entity
@Table(name="t_classroom")
public class Classroom {
private int id ;
private String name;
private Set<Student> students;
@OneToMany(mappedBy="cla")//mappedBy="cla"让多的一方的cla属性来维护关系
@LazyCollection(LazyCollectionOption.EXTRA)//让在Classroom中取students集合的大小的时候使用Count
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
@Id
@GeneratedValue
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 org.com.test.model;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="t_student")
public class Student {
private int id ;
private String name ;
private int no;
private Classroom cla;
@Id
@GeneratedValue
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;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
@ManyToOne(fetch=FetchType.LAZY)//让延迟加载恢复作用。
@JoinColumn(name="c_id")//把默认的关联列的名称改成c_id;
public Classroom getCla() {
return cla;
}
public void setCla(Classroom cla) {
this.cla = cla;
}
}
package org.com.test.test;
import org.com.test.model.Classroom;
import org.com.test.model.Student;
import org.com.test.util.HibernateUtil;
import org.hibernate.Session;
import org.junit.Test;
public class TestManyToOne {
@Test
public void testAdd(){
Session session = null;
try {
session = HibernateUtil.getSession();
session.beginTransaction();
Classroom c = new Classroom();
c.setName("网络技术班1");
Student s = new Student();
Student s1 = new Student();
s.setName("张三1");
s.setNo(12);
s.setCla(c);
s1.setName("李四1");
s1.setNo(13);
s1.setCla(c);
session.save(s);
session.save(s1);
/**
* Hibernate: insert into t_student (name, no, c_id) values (?, ?, ?)
Hibernate: insert into t_student (name, no, c_id) values (?, ?, ?)
Hibernate: insert into t_classroom (name) values (?)
Hibernate: update t_student set name=?, no=?, c_id=? where id=?
Hibernate: update t_student set name=?, no=?, c_id=? where id=?
*/
session.save(c);//如果后面才添加classroom则发五条SQL;三条插入,两条更新
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtil.closeSession(session);
}
}
@Test
public void testLoad(){
Session session = null;
try {
session = HibernateUtil.getSession();
session.beginTransaction();
Student s = (Student)session.load(Student.class, 1);//延迟加载,此时对象s只是代理对象,只有一个id;
//System.out.println(s.getName());//使用s的id意外的数据的时候才发sql取数据。
/**
* 此时取Student关联对象Classroom的时候也是延迟加载的,会再发一条sql取Classroom对象。
*/
System.out.println(s.getCla().getName());
session.getTransaction().commit();
} finally{
HibernateUtil.closeSession(session);
}
}
@Test
public void testLoad2(){
Session session = null;
try {
session = HibernateUtil.getSession();
session.beginTransaction();
Classroom c = (Classroom)session.load(Classroom.class, 1);
System.out.println(c.getStudents().size());
session.getTransaction().commit();
} finally{
HibernateUtil.closeSession(session);
}
}
}