还是接上次的往下做,
sql表新增一个
Oders表,studentId是student表的外键,表示学生可以订购多个订单。
Orders.java
package com.entity;
public class Student {
private String id;
private String name;
private Long age;
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 Long getAge() {
return age;
}
public void setAge(Long age) {
this.age = age;
}
}
Orders.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">
<hibernate-mapping>
<class name="com.entity.Orders" table="orders">
<id name="id" column="Id" type="string">
<generator class="uuid"/>
</id>
<property name="orderName" column="orderName" lazy="false" type="string"/>
<!-- 单向一对多关系的配置
两个属性应该引起注意。。。
1、not-null 默认为false 可以设置studentId为null,设置成true,表示插入“多”方的数据时,必须关联单方
2、cascade 不设置为none,表示分别保存对象,不进行连级更新,设置为save-update 时,可以进行连级更新
详细见Hibernate04
附: all: 所有情况下均进行关联操作,即save-update和delete。
none: 所有情况下均不进行关联操作。这是默认值。
save-update: 在执行save/update/saveOrUpdate时进行关联操作。
delete: 在执行delete 时进行关联操作。
all-delete-orphan: 当一个节点在对象图中成为孤儿节点时,删除该节点。比如在一个一对多的关系中,Student包含多个book,当在对象关系中删除一个book时,此book即成为孤儿节点。
-->
<many-to-one
name="student"
column="studentId"
class="com.entity.Student"
not-null="true"
cascade="save-update"
lazy="false"/>
</class>
</hibernate-mapping>
别忘了在Hibernate.cgf.xml中加入
<mapping resource="com/entity/Orders.hbm.xml"/>
OK,实体创建完成
直接上主体代码
Hibernate04.java
package com.test;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.entity.Orders;
import com.entity.Student;
public class Hibernate04 {
public static SessionFactory sessionFactory;
static {
try {
//有可能产生异常,使用try语句
Configuration cfg=new Configuration().configure();
//应用程序或资源的配置文件。无法继承此类。
sessionFactory= cfg.buildSessionFactory();
//Hibernate的核心接口之一 SessionFactory接口:SessionFactroy接口负责初始化Hibernate。它充//当数据存储源的代理,并负责创建Session对象。
} catch (HibernateException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Hibernate04 h2 = new Hibernate04();
// h2.saveStudentAndOrders();
// h2.deleteStudentAndOrders();
h2.findStudentAndOrders();
}
public void saveStudentAndOrders(){
Session session = sessionFactory.openSession();
Transaction ts =null;
try {
ts = session.beginTransaction();
//实例化Student对象并保存
Student s = new Student();
s.setName("张三");
s.setAge(14L);
//这句不写会报错,原因是Orders.hbm.xml 中配置了 not-null="true"
//实例化Orders对象并保存
Orders o = new Orders();
o.setOrderName("123");
//设置单向一对多关系
o.setStudent(s);
session.save(o);
//这句不写会报错,原因是Orders.hbm.xml 中配置了 not-null="true"(cascade没设置时)
//当设置了cascade="save-update"是,保存s便变得可有可无了,因为在保存orders对象的时候
//会自动持久化s,所有这句有没有的效果一样
session.save(s);
ts.commit();
} catch (HibernateException e) {
e.printStackTrace();
ts.rollback();
}finally{
session.close();
}
}
public void deleteStudentAndOrders(){
Session session = sessionFactory.openSession();
Transaction ts =null;
try {
ts = session.beginTransaction();
Orders o =new Orders();
o.setId("ff8080813595f45b013595f45c380001");
//删除目前只能这样删除,因为o是依赖于student的student才是主体,
//要实现连级删除,明天的一对多双向联系的配置中会有涉及
session.delete(o);
ts.commit();
} catch (HibernateException e) {
e.printStackTrace();
ts.rollback();
}finally{
session.close();
}
}
public void findStudentAndOrders(){
Session session = sessionFactory.openSession();
Transaction ts =null;
try {
ts = session.beginTransaction();
//设置了一对多关系,能自动加载关联对象
Orders o =(Orders) session.load(Orders.class, "402881eb359606630135960665130001");
System.out.println(o.getOrderName());
System.out.println(o.getStudent().getName());
ts.commit();
} catch (HibernateException e) {
e.printStackTrace();
ts.rollback();
}finally{
session.close();
}
}
}
。如有什么问题欢迎来博客留言。