hibernate的级联-----one-to-one
2014-10-28 19:27
344 查看
以下示例均为双向关联,
一对一:
学生证表和学生表,学生证表中有学生的id,理论上,一对一完全可以合成为一张表,
学生证表对应的entity:
package com.entity;
public class Paper {
private Integer id;
private String desc;
private Student student;
public Paper() {
super();
}
public Paper(String desc) {
super();
this.desc = desc;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
学生表对应的entity:
package com.entity;
public class Student {
private Integer id;
private String name;
private Paper paper;
public Student() {
super();
}
public Student(String name) {
super();
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Paper getPaper() {
return paper;
}
public void setPaper(Paper paper) {
this.paper = paper;
}
}
学生证表Paper.hbm.xml:
表中字段设置,实体类和数据库表字段一一对应,值得一提的是,hibernate提供了主键的自增,如果在这里设置自增的话,增加数据的时候,会先执行一条判断当前数据库主键的最大值,然后从最大值+1保存,这个机制比数据库自身的sequence要好用得多;
数据库是不会判断两个表是一对一还是多对多的,数据库只认外键,就是说设置有外键的表为多的一方,而另外的一方为对应的一的一方,因此此处学生证表中设置为many-to-one,
与数据库相照应,
<?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 package="com.entity">
<class name="Paper" table="PAPER">
<id name="id" type="integer" column="ID" >
<generator class="increment"/>
</id>
<property name="desc" column="STU_DESC"></property>
<many-to-one name="student" class="Student" column="STU_ID" unique-key="true" cascade="all"></many-to-one>
</class>
</hibernate-mapping>
学生表的xml:
<hibernate-mapping package="com.entity">
<class name="Student" table="STUDENT">
<id name="id" type="integer" column="ID" >
<generator class="increment"/>
</id>
<property name="name" column="NAME"></property>
<one-to-one name="paper" class="Paper"></one-to-one>
</class>
</hibernate-mapping>
下面是测试类:
package com.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.entity.Paper;
import com.entity.Student;
public class TestOne2One {
public static void main(String[] args) {
TestOne2One test = new TestOne2One();
test.add();
}
public void add() {
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Student student = new Student("李四");
Paper paper = new Paper();
paper.setDesc("1010111021545");
paper.setStudent(student);
// student.setPaper(paper);
Transaction tr = session.beginTransaction();
// session.save(student);//如果想用级联的话,需要从从表寻找主表,在从表的配置中,设置cascade;
//不用级联的话,可以双向关联,然后save主表,即student
session.save(paper);
tr.commit();
session.close();
factory.close();
}
public void query(){
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Paper paper = (Paper) session.get(Paper.class, 1);
Student student = paper.getStudent();
System.out.println(student.getName());
session.close();
factory.close();
}
public void delete(){
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Transaction tr = session.beginTransaction();
Paper paper = (Paper) session.get(Paper.class, 2);
session.delete(paper);
tr.commit();
session.close();
factory.close();
}
}
一对一:
学生证表和学生表,学生证表中有学生的id,理论上,一对一完全可以合成为一张表,
学生证表对应的entity:
package com.entity;
public class Paper {
private Integer id;
private String desc;
private Student student;
public Paper() {
super();
}
public Paper(String desc) {
super();
this.desc = desc;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
学生表对应的entity:
package com.entity;
public class Student {
private Integer id;
private String name;
private Paper paper;
public Student() {
super();
}
public Student(String name) {
super();
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Paper getPaper() {
return paper;
}
public void setPaper(Paper paper) {
this.paper = paper;
}
}
学生证表Paper.hbm.xml:
表中字段设置,实体类和数据库表字段一一对应,值得一提的是,hibernate提供了主键的自增,如果在这里设置自增的话,增加数据的时候,会先执行一条判断当前数据库主键的最大值,然后从最大值+1保存,这个机制比数据库自身的sequence要好用得多;
数据库是不会判断两个表是一对一还是多对多的,数据库只认外键,就是说设置有外键的表为多的一方,而另外的一方为对应的一的一方,因此此处学生证表中设置为many-to-one,
与数据库相照应,
<?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 package="com.entity">
<class name="Paper" table="PAPER">
<id name="id" type="integer" column="ID" >
<generator class="increment"/>
</id>
<property name="desc" column="STU_DESC"></property>
<many-to-one name="student" class="Student" column="STU_ID" unique-key="true" cascade="all"></many-to-one>
</class>
</hibernate-mapping>
学生表的xml:
<hibernate-mapping package="com.entity">
<class name="Student" table="STUDENT">
<id name="id" type="integer" column="ID" >
<generator class="increment"/>
</id>
<property name="name" column="NAME"></property>
<one-to-one name="paper" class="Paper"></one-to-one>
</class>
</hibernate-mapping>
下面是测试类:
package com.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.entity.Paper;
import com.entity.Student;
public class TestOne2One {
public static void main(String[] args) {
TestOne2One test = new TestOne2One();
test.add();
}
public void add() {
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Student student = new Student("李四");
Paper paper = new Paper();
paper.setDesc("1010111021545");
paper.setStudent(student);
// student.setPaper(paper);
Transaction tr = session.beginTransaction();
// session.save(student);//如果想用级联的话,需要从从表寻找主表,在从表的配置中,设置cascade;
//不用级联的话,可以双向关联,然后save主表,即student
session.save(paper);
tr.commit();
session.close();
factory.close();
}
public void query(){
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Paper paper = (Paper) session.get(Paper.class, 1);
Student student = paper.getStudent();
System.out.println(student.getName());
session.close();
factory.close();
}
public void delete(){
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Transaction tr = session.beginTransaction();
Paper paper = (Paper) session.get(Paper.class, 2);
session.delete(paper);
tr.commit();
session.close();
factory.close();
}
}
相关文章推荐
- eclipse中用Hibernate进行一对多级联报错 Could not parse mapping document from resource oneToMore/Grade.hbm.xml
- hibernate OnetoOne 级联删除
- Hibernate实现one-to-one级联保存
- hibernate 一对一(one to one)级联保存
- [置顶] 关于jpa、hibernate的级联关系及注解OneToOne等注解解释
- Hibernate级联实践之二(many-to-one)
- Hibernate在进行one-to-many时的级联设置-cascade
- Hibernate中使用JPA注解@OneToMany的cascade级联标签
- hibernate的级联-----many-to-one
- 关于如何实现在整合struts2和hibernate4框架下对many-to-one级联数据的存储
- 关于如何实现在整合struts2和hibernate4框架下实现many-to-one级联数据表在JSP页面中的输出
- Hibernate级联实践之一(one-to-one)
- Hibernate 实体级联配置(one-to-one,many-to-one,many-to-many)
- 一个完整的hibernate的one-to-many的例子
- Hibernate中Many to one如何设置LAZY
- (转贴)hibernate:one-to-one的学习小经验
- 在面对级联关联(one-to-many......)查询的时候,你是怎么解决hibernate session关闭的?我是这样做的。
- Hibernate中的一对一(onetoone)映射
- Hibernate 级联保存时 偶尔会出现 "id to load is required for loading" 问题的解决办法
- Hibernate入门之OneToOne