hibernate关联保存(一对多)

弄了几天,终于做出Hibernate的第一个关联保存的例子出来了,还跑去广州购书中心看了一个下午的书,
还是感谢网友的帮助,让我弄懂了inverse和cascade这两个属性的使用。

package com.test.ORM;

import java.util.Set;

public class Student {
private int sid ;
private String sname ;
private String sage ;
private Set book;//用来接收、获取Book的对应一端中的<set name="就是这个名字">
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSage() {
return sage;
}
public void setSage(String sage) {
this.sage = sage;
}
public Set getBook() {
return book;
}
public void setBook(Set book) {
this.book = book;
}
}

<?xml version="1.0" encoding="utf-8"?>
<!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.test.ORM.Student" table="student">
<id name="sid" type="int" >
<column name="sid" not-null="true"/>
<generator class="increment"/>
</id>
<property name="sname" type="string">
<column name="sname" not-null="true"/>
</property>
<property name="sage" type="string">
<column name="sage" not-null="true"/>
</property>
<set name="book" table="book" inverse="false" cascade="all">//最重点的地方,inverse="false"表示双向关联,也就是关系由两端来控制.cascade="all"就是关联的级别,还有all就是说无论是一方所有的操作(sava、update、delete等)当然也有其他值的。另一方也跟这对应的改变。
<key column="sid" />
<one-to-many class="com.test.ORM.Book" />
</set>
</class>
</hibernate-mapping>

package com.test.ORM;

public class Book {
private int bid ;
private String bname ;
private String bprice ;
private Student student;

public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public int getBid() {
return bid;
}
public void setBid(int bid) {
this.bid = bid;
}
public String getBname() {
return bname;
}
public void setBname(String bname) {
this.bname = bname;
}
public String getBprice() {
return bprice;
}
public void setBprice(String bprice) {
this.bprice = bprice;
}
}

<?xml version="1.0" encoding="utf-8"?>
<!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.test.ORM.Book" table="book">
<id name="bid" type="integer">
<column name="bid" not-null="true" />
<generator class="increment"/>
</id>
<property name="bname">
<column name="bname" sql-type="varchar(16)" not-null="true"/>
</property>
<property name="bprice">
<column name="bprice" sql-type="varchar(16)" not-null="true"/>
</property>
<many-to-one name="student" class="com.test.ORM.Student" fetch="select">//用来介绍一方中的students,呵呵,对应Book类中的private Student student;
<column name="sid" not-null="true"/>
</many-to-one>
</class>
</hibernate-mapping>

package com.test;

import java.util.HashSet;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.test.ORM.Book;
import com.test.ORM.Student;

public class TestOneToMany {

/**
* @param 测试类
*/
public static void main(String[] args)throws Exception {
SessionFactory sf;
Session session;
Configuration config=new Configuration();
config.configure();
sf=config.buildSessionFactory();
session=sf.openSession();
Transaction ts=session.beginTransaction();
//new 两个对象,只要保存student,book就会自动保存了
Student student=new Student();
student.setSname("student2");
student.setSage("sage2");


Book book=new Book();
book.setBname("bname2");
book.setBprice("bprice2");
book.setStudent(student);

Set bookSet=new HashSet();
bookSet.add(book);
student.setBook(bookSet);
session.save(student);

ts.commit();
session.flush();

session.close();
}
}

要具体了解hibernate 还是去看下hibernate 的保存机制吧,包括OID,事务管理什么的

错误解析:

package com.test;

import java.util.HashSet;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.test.ORM.Book;
import com.test.ORM.Student;

public class TestOneToMany {

/**
* @param 测试类
*/
public static void main(String[] args)throws Exception {
SessionFactory sf;
Session session;
Configuration config=new Configuration();
config.configure();
sf=config.buildSessionFactory();
session=sf.openSession();
Transaction ts=session.beginTransaction();

Student student=new Student();
student.setSname("student3");
student.setSage("sage3");

Book book=new Book();
Set bookSet=new HashSet();

for(int i=0;i<2;i++){
book.setBname("bname"+(2+i));
book.setBprice("bprice"+(2+i));
bookSet.add(book);
System.out.println(i);
}
student.setBook(bookSet);
session.save(student);

ts.commit();
session.flush();

session.close();
}
}

//Hibernate: select max(sid) from student
//Hibernate: select max(bid) from book
//Hibernate: insert into student (sname, sage, sid) values (?, ?, ?)
//Hibernate: insert into book (bname, bprice, sid, bid) values (?, ?, ?, ?)
//Hibernate: update book set sid=? where bid=?
//先插入student,然后插入book,再更新book中的sid,但如果你的sid不能为空not-null="true"的话,那么在插入book的时候就会出现异常了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值