您的位置:首页 > 其它

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();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate 关联