基于外键映射的 一对一关系
2016-10-30 16:13
134 查看
一.
二.代码实现
1.Department
package cn.edu.sdut.hibernate.onetoone;
public class Department {
private int deId;
private String deName;
private Manager mgr;
public int getDeId() {
return deId;
}
public void setDeId(int deId) {
this.deId = deId;
}
public String getDeName() {
return deName;
}
public void setDeName(String deName) {
this.deName = deName;
}
public Manager getMgr() {
return mgr;
}
public void setMgr(Manager mgr) {
this.mgr = mgr;
}
}
2. Manager
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2016-10-30 14:28:39 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="cn.edu.sdut.hibernate.onetoone.Department" table="DEPARTMENTS">
<id name="deId" type="int">
<column name="DE_ID" />
<generator class="native" />
</id>
<property name="deName" type="java.lang.String">
<column name="DE_NAME" />
</property>
<many-to-one name="mgr" class="cn.edu.sdut.hibernate.onetoone.Manager">
<column name="MA_ID" unique="true"></column>
</many-to-one>
</class>
</hibernate-mapping>
4.Manager.hbm.xml
package cn.edu.sdut.hibernate.onetoone;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class DoubleOneToOneTest {
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void init(){
Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry =
new ServiceRegistryBuilder().applySettings(configuration.getProperties())
.buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
session = sessionFactory.openSession();
transaction = session.beginTransaction();
}
@After
public void destory(){
transaction.commit();
session.close();
sessionFactory.close();
}
@Test
public void testSave(){
Manager manager = new Manager();
manager.setmName("csc");
Department department = new Department();
department.setDeName("AA");
department.setMgr(manager);
manager.setDepartment(department);
//保存的时候先保存1to1的,后保存nto1(设置为unique = true),效率高
session.save(manager);
session.save(department);
}
@Test
public void testGet(){
//get获取的时候不会出现懒加载异常,因为在得到manger的时候会把所有的信息加载出来
Manager manager = (Manager) session.get(Manager.class, 1);
System.out.println(manager.getDepartment().getClass().getName());
}
@Test
public void testDelete(){
//再不设置联级关系的时候不能联级删除
Manager manager = (Manager) session.get(Manager.class, 2);
// Department department = (Department) session.get(Department.class, 1);
// session.delete(department);
session.delete(manager);
}
}
6、hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 配置连接数据库的基本信息 -->
<property name="connection.username">root</property>
<property name="connection.password">csc</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///hibernate5</property>
<!-- 配置hibernate的基本信息 -->
<!-- hibernate 所使用的数据库方言 -->
<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<!-- 执行sql时是否在控制台上打印 -->
<property name="show_sql">true</property>
<!-- 是否对sql进行格式化 -->
<property name="format_sql">true</property>
<!-- 指定自动生成数据表的策略 -->
<property name="hbm2ddl.auto">update</property>
<!-- 指定session的delete方法会把对象的id置为null -->
<property name="hibernate.use_identifier_rollback">true</property>
<!-- 指定数据库的隔离级别 -->
<property name="connection.isolation">2</property>
<!-- 配置c3p0数据池 -->
<property name="hibernate.c3p0.max_size">100</property>
<property name="hibernate.c3p0.min_size">20</property>
<property name="hibernate.c3p0.acquire_increment">5</property>
<property name="hibernate.c3p0.timeout">2000</property>
<property name="hibernate.c3p0.idle_test_period">2000</property>
<property name="hibernate.c3p0.max_statements">10</property>
<!-- 设定JDBC的statment读取数据的时候每次在数据库中读取的记录的条数 -->
<property name="hibernate.jdbc.fetch_size">100</property>
<!-- 设定对数据进行批量操作,批次更新和批次插入的批次大小 -->
<property name="hibernate.jdbc.batch_size">30</property>
<!-- 指定关联的xxx.hbm.xml文件 -->
<mapping resource="cn/edu/sdut/hibernate/helloworld/News.hbm.xml"/>
<mapping resource="cn/edu/sdut/hibernate/manytoone/Customer.hbm.xml"/>
<mapping resource="cn/edu/sdut/hibernate/manytoone/Order.hbm.xml"/>
<mapping resource="cn/edu/sdut/hibernate/onetoone/Department.hbm.xml"/>
<mapping resource="cn/edu/sdut/hibernate/onetoone/Manager.hbm.xml"/>
</session-factory>
</hibernate-configuration>
二.代码实现
1.Department
package cn.edu.sdut.hibernate.onetoone;
public class Department {
private int deId;
private String deName;
private Manager mgr;
public int getDeId() {
return deId;
}
public void setDeId(int deId) {
this.deId = deId;
}
public String getDeName() {
return deName;
}
public void setDeName(String deName) {
this.deName = deName;
}
public Manager getMgr() {
return mgr;
}
public void setMgr(Manager mgr) {
this.mgr = mgr;
}
}
2. Manager
package cn.edu.sdut.hibernate.onetoone; public class Manager { private int maId; private String mName; private Department department; public int getMaId() { return maId; } public void setMaId(int maId) { this.maId = maId; } public String getmName() { return mName; } public void setmName(String mName) { this.mName = mName; } public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } }3.Department.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">
<!-- Generated 2016-10-30 14:28:39 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="cn.edu.sdut.hibernate.onetoone.Department" table="DEPARTMENTS">
<id name="deId" type="int">
<column name="DE_ID" />
<generator class="native" />
</id>
<property name="deName" type="java.lang.String">
<column name="DE_NAME" />
</property>
<many-to-one name="mgr" class="cn.edu.sdut.hibernate.onetoone.Manager">
<column name="MA_ID" unique="true"></column>
</many-to-one>
</class>
</hibernate-mapping>
4.Manager.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"> <!-- Generated 2016-10-30 14:28:39 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="cn.edu.sdut.hibernate.onetoone.Manager" table="MANAGERS"> <id name="maId" type="int"> <column name="MA_ID" /> <generator class="native" /> </id> <property name="mName" type="java.lang.String"> <column name="M_NAME" /> </property> <one-to-one name="department" class="cn.edu.sdut.hibernate.onetoone.Department" property-ref="mgr"></one-to-one> </class> </hibernate-mapping>5.DoubleOneToOneTest
package cn.edu.sdut.hibernate.onetoone;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class DoubleOneToOneTest {
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void init(){
Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry =
new ServiceRegistryBuilder().applySettings(configuration.getProperties())
.buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
session = sessionFactory.openSession();
transaction = session.beginTransaction();
}
@After
public void destory(){
transaction.commit();
session.close();
sessionFactory.close();
}
@Test
public void testSave(){
Manager manager = new Manager();
manager.setmName("csc");
Department department = new Department();
department.setDeName("AA");
department.setMgr(manager);
manager.setDepartment(department);
//保存的时候先保存1to1的,后保存nto1(设置为unique = true),效率高
session.save(manager);
session.save(department);
}
@Test
public void testGet(){
//get获取的时候不会出现懒加载异常,因为在得到manger的时候会把所有的信息加载出来
Manager manager = (Manager) session.get(Manager.class, 1);
System.out.println(manager.getDepartment().getClass().getName());
}
@Test
public void testDelete(){
//再不设置联级关系的时候不能联级删除
Manager manager = (Manager) session.get(Manager.class, 2);
// Department department = (Department) session.get(Department.class, 1);
// session.delete(department);
session.delete(manager);
}
}
6、hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 配置连接数据库的基本信息 -->
<property name="connection.username">root</property>
<property name="connection.password">csc</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///hibernate5</property>
<!-- 配置hibernate的基本信息 -->
<!-- hibernate 所使用的数据库方言 -->
<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<!-- 执行sql时是否在控制台上打印 -->
<property name="show_sql">true</property>
<!-- 是否对sql进行格式化 -->
<property name="format_sql">true</property>
<!-- 指定自动生成数据表的策略 -->
<property name="hbm2ddl.auto">update</property>
<!-- 指定session的delete方法会把对象的id置为null -->
<property name="hibernate.use_identifier_rollback">true</property>
<!-- 指定数据库的隔离级别 -->
<property name="connection.isolation">2</property>
<!-- 配置c3p0数据池 -->
<property name="hibernate.c3p0.max_size">100</property>
<property name="hibernate.c3p0.min_size">20</property>
<property name="hibernate.c3p0.acquire_increment">5</property>
<property name="hibernate.c3p0.timeout">2000</property>
<property name="hibernate.c3p0.idle_test_period">2000</property>
<property name="hibernate.c3p0.max_statements">10</property>
<!-- 设定JDBC的statment读取数据的时候每次在数据库中读取的记录的条数 -->
<property name="hibernate.jdbc.fetch_size">100</property>
<!-- 设定对数据进行批量操作,批次更新和批次插入的批次大小 -->
<property name="hibernate.jdbc.batch_size">30</property>
<!-- 指定关联的xxx.hbm.xml文件 -->
<mapping resource="cn/edu/sdut/hibernate/helloworld/News.hbm.xml"/>
<mapping resource="cn/edu/sdut/hibernate/manytoone/Customer.hbm.xml"/>
<mapping resource="cn/edu/sdut/hibernate/manytoone/Order.hbm.xml"/>
<mapping resource="cn/edu/sdut/hibernate/onetoone/Department.hbm.xml"/>
<mapping resource="cn/edu/sdut/hibernate/onetoone/Manager.hbm.xml"/>
</session-factory>
</hibernate-configuration>
相关文章推荐
- hibernate实现一对一关系映射(基于外键)
- Hibernate关系映射(一) 基于外键的单向一对一
- Hibernate关系映射(二) 基于外键的双向一对一
- Hibernate 关系映射(7) 基于外键关联的单向1:N
- Hibernate关系映射 一对一双向外键关联@OneToOne Annotation方式
- Hibernate之基于外键映射的一对一(1-1)关联关系
- Hibernate基于外键一对一映射操作实例
- 基于主键映射的 一对一关系
- Hibernate关系映射(二)一对一双向外键关联@OneToOne Annotation方式
- 主键共享方式和外键方式一对一双向关系映射(参考张龙老师的例子)
- Hibernate关系映射 一对一双向外键关联@OneToOne Annotation方式 双向关联和单向关联的区别
- hibernate笔记--基于主键的单(双)向的一对一映射关系
- Hibernate关系映射(一)一对一单向外键关联@OneToOne Annotation方式
- Hibernate之对象关系映射03一对一单向外键关联
- Hibernate_映射_关联关系_一对一映射2_基于外键的方式
- Entity Framework - 理清关系 - 基于外键关联的单向一对一关系
- Hibernate学习——(五)基于Annotation的一对一外键映射
- 基于外键的一对一关系
- 第十章 基于Annotation的关系映射 一对一
- Hibernate 基于外键一对一映射(单双向)