hibernate的ManyToOne的单向关联

时间:2022-12-20 13:26:54

一对多的关系
1.学生和班级为一堆多的管理
学生实体:

public class Student {
private int id;
private String name;
private String no;
private ClassRoom classRoom;
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 String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public ClassRoom getClassRoom() {
return classRoom;
}
public void setClassRoom(ClassRoom classRoom) {
this.classRoom = classRoom;
}
}
//对应的xml配置
<hibernate-mapping package="bo">
<class name="Student" table="t_student">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<property name="no" />
<!-- many-to-one 用来映射多对一,name用来表示对象中的属性名称
column:用来表示外建的名称
-->
<many-to-one name="classRoom" column="cid"></many-to-one>
</class>
</hibernate-mapping>

班级实体:

public class ClassRoom {
private int id;
private String name;
private int grade;
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 getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
}
//对应xml配置
<hibernate-mapping package="bo">
<class name="ClassRoom" table="t_class">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<property name="grade" />
</class>
</hibernate-mapping>

明显有多的一方来维护关系,
这种方式的最佳实践方式是一定要先添加一的一端,再添加多的一端

实现方式如下:

public void testAdd01(){
Session session=null;
try{
session=HibernateUtil.openSession();
session.beginTransaction();
//先添加一端
ClassRoom c=new ClassRoom();
c.setGrade(2013);
c.setName("计算机网络技术");
session.save(c);
Student stu1=new Student();
stu1.setName("猪八戒");
stu1.setNo("001");
stu1.setClassRoom(c);
session.save(stu1);
Student stu2=new Student();
stu2.setName("孙悟空");
stu2.setNo("002");
stu2.setClassRoom(c);
session.save(stu2);
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
if(session!=null) session.getTransaction().rollback();
}finally{
if(session!=null) session.close();
}
}

load的时候注意

    @Test
public void testLoad(){
Session session=null;
try{
session=HibernateUtil.openSession();
Student s=(Student) session.load(Student.class, 1);
//此时会发一条sql语句
System.out.println(s.getName());
//此时student的关联对象ClassRoom也是延时加载的,会再发一条sql
System.out.println(s.getClassRoom().getName());
}catch(Exception e){
e.printStackTrace();
}finally{
if(session!=null) session.close();
}
}

hibernate的级联实现:
最佳实践:如果没有特殊情况,不要使用级联,特别注意使用cascade地方一般都是一的一方删除时使用,特殊需求才会使用cascade的add,

<!--当设置cascade的时候,会自动完成关联,如果添加时没有关联对象
会自动 创建一个关联对象-->

<many-to-one name="classRoom" column="cid" cascade="all"/>