Hibernate一对一双向关联(注解)
package cqvie.yjq.domain; import java.util.Date; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; @Entity
@Table(name = "id_card", catalog = "test")
public class IdCard implements java.io.Serializable { private static final long serialVersionUID = -5388108961244621175L; @Id
@GenericGenerator(name = "generator", strategy = "uuid")
@GeneratedValue(generator = "generator")
@Column(name = "card_id", unique = true, nullable = false)
private String id;
@Column(name = "validate")
private Date validateDte;
@OneToOne
@JoinColumn(name = "per")
private Person person; public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Date getValidateDte() {
return validateDte;
}
public void setValidateDte(Date validateDte) {
this.validateDte = validateDte;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
} }
实体类IdCard
package cqvie.yjq.domain; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; @Entity
@Table(name = "person", catalog = "test")
public class Person implements java.io.Serializable { private static final long serialVersionUID = 3860690163559279293L; @Id
@GenericGenerator(name = "generator", strategy = "uuid")
@GeneratedValue(generator = "generator")
@Column(name = "per_id", unique = true, nullable = false)
private String id;
@Column(name = "name", nullable = false, length = 20)
private String name;
@OneToOne
@JoinColumn(name = "id_c")
private IdCard idCard; 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 IdCard getIdCard() {
return idCard;
}
public void setIdCard(IdCard idCard) {
this.idCard = idCard;
} }
实体类Person
package cqvie.yjq.View; import java.util.Date; import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport; import cqvie.yjq.Util.HibernataUtil;
import cqvie.yjq.domain.IdCard;
import cqvie.yjq.domain.Person; public class Test { public static void main(String[] args) { //调用建表语句
exportDDL();
//添加一组person
Session session = null;
Transaction tx = null;
try {
session = HibernataUtil.getCurrentSession();
tx = session.beginTransaction(); Person p1 = new Person();
p1.setName("张三"); IdCard idCard = new IdCard();
idCard.setValidateDte(new Date());
p1.setIdCard(idCard);
idCard.setPerson(p1);
session.save(p1);
session.save(idCard); tx.commit();
} catch (Exception e) {
if(tx != null) {
tx.rollback();
}
} finally {
if(session != null && session.isOpen()) {
session.close();
}
} } //建表语句
public static void exportDDL() {
Configuration configuration = new AnnotationConfiguration().configure();
SchemaExport sexport = new SchemaExport(configuration);
sexport.setFormat(true);//格式化输出
sexport.setDelimiter(";"); //每句sql都以;结尾 不然导入sql的时候会出现错误
sexport.setOutputFile("D:\\auto.sql");
sexport.create(true, true);
}
}
测试类Test
<?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"> <!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration> <session-factory>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/test
</property>
<property name="connection.username">root</property>
<property name="connection.password">123</property>
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="myeclipse.connection.profile">MySQL</property>
<property name="show_sql">true</property>
<!-- 格式化显示SQL -->
<property name="format_sql">true</property> <property name="current_session_context_class">thread</property>
<!-- 让hibernate自动创建表 update:如果没有表则创建,有表则更新 -->
<property name="hbm2ddl.auto">create</property>
<mapping class="cqvie.yjq.domain.IdCard" />
<mapping class="cqvie.yjq.domain.Person" />
</session-factory> </hibernate-configuration>
Hibernate.cfg.xml
package cqvie.yjq.Util; import java.util.List; import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration; final public class HibernataUtil { private static SessionFactory sessionFactory = null;
//使用线程局部模式
private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
private HibernataUtil() {};
static {
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
}
//获取全新的session
public static Session openSession() {
return sessionFactory.openSession();
}
//获取和线程关联的session
public static Session getCurrentSession() {
Session session = threadLocal.get();
//判断是否得到
if(session == null) {
session = sessionFactory.openSession();
//把session对象设置到threadLocal,相当于已经和线程绑定
threadLocal.set(session);
}
return session;
} //提供一个统一的修改和删除方法(批量)
public static void executeUpdate(String hql, String[] parameters) {
Session s = null;
Transaction ts = null;
try {
s = openSession();
ts = s.beginTransaction();
Query query = s.createQuery(hql);
//先判断是否有参数要绑定
if(parameters != null && parameters.length > 0) {
for(int i=0;i<parameters.length;i++) {
query.setString(i, parameters[i]);
}
}
query.executeUpdate();
ts.commit();
} catch(Exception e) {
e.printStackTrace();
throw new RuntimeException();
} finally {
if(s != null && s.isOpen()) {
s.close();
}
}
} //提供一个统一的添加方法
public static void sava(Object obj) {
Session s = null;
Transaction ts = null;
try {
s = openSession();
ts = s.beginTransaction();
s.save(obj);
ts.commit();
} catch (Exception e) {
if(ts != null) {
ts.rollback();
}
throw new RuntimeException();
} finally {
if(s != null && s.isOpen()) {
s.close();
}
}
} //提供一个统一的查询方法(分页)
@SuppressWarnings("unchecked")
public static List executeQueryByPage(String hql, String[] parameters, int pageSize, int pageNow) {
Session s = null;
List list = null;
try {
s = openSession();
Query query = s.createQuery(hql);
//先判断是否有参数要绑定
if(parameters != null && parameters.length > 0) {
for(int i=0;i<parameters.length;i++) {
query.setString(i, parameters[i]);
}
}
query.setFirstResult((pageNow-1)*pageSize).setMaxResults(pageSize);
list = query.list();
} catch(Exception e) {
e.printStackTrace();
throw new RuntimeException();
} finally {
if(s != null && s.isOpen()) {
s.close();
}
}
return list;
} //提供一个统一的查询方法 hql 形式 from 类 where 条件=?
@SuppressWarnings("unchecked")
public List executeQuery(String hql, String[] parameters) {
Session s = null;
List list = null;
try {
s = openSession();
Query query = s.createQuery(hql);
//先判断是否有参数要绑定
if(parameters != null && parameters.length > 0) {
for(int i=0;i<parameters.length;i++) {
query.setString(i, parameters[i]);
}
}
list = query.list();
} catch(Exception e) {
e.printStackTrace();
throw new RuntimeException();
} finally {
if(s != null && s.isOpen()) {
s.close();
}
}
return list;
}
}
工具类HibernateUtil
Hibernate一对一双向关联(注解)的更多相关文章
- Hibernate一对一双向关联映射
关键原因在于对象模型具有方向性: 单向:一端只能加载另一端,不能反过来. 双向:两端都可以加载另一端. 问题来了:如何我们想从身份证端(IdCard)加载人(Person),怎么办呢? 下面我们开始介 ...
- Hibernate一对一双向关联(外键)
网站上各种搜索,都是一些清晰或者不清晰的例子,但是用下来一是确实不给力,二是完全不知道所以然. 后来终于在书中查到了就在这里记一下. 首先要说明,这里只解释双向一对一只有一个表里面有外键的情况. 就以 ...
- Hibernate 一对一双向映射 注解方式
有外键的一方: @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "courseid") public Tcourse ge ...
- Java进阶知识07 Hibernate一对一双向外键关联(Annotation+XML实现)
1.Annotation 注解版 1.1.创建Husband类和Wife类 package com.shore.model; import javax.persistence.Entity; impo ...
- Hibernate从入门到精通(六)一对一双向关联映射
在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射,这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映射所不同的的 ...
- HIBERNATE一对一双向外键联合主键关联
HIBERNATE一对一双向外键联合主键关联: 一. 创建主键类:这个主键必须实现serializedable接口和重写其中的hashCode方法和equals方法:为主键类添加一个叫做@Embedd ...
- Hibernate(六)一对一双向关联映射
在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射, 这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映 射所不同 ...
- (Hibernate进阶)Hibernate映射——一对一双向关联映射(六)
上一篇博客我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.如图所示: 关键原因在于对象模型具有方向性: 单向: ...
- 【SSH系列】hibernate映射 -- 一对一双向关联映射
开篇前言 上篇博文[SSH进阶之路]hibernate映射--一对一单向关联映射,小编介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身 ...
随机推荐
- java中Color类的简单总结
java中Color类的简单总结 1.颜色的常识 任何颜色都是由三原色组成(RGB),JAVA中支持224为彩色,即红绿蓝分量取值 介于0-255之间(8位表示) 2.Color类中的常量 publi ...
- AChartEngine 图表绘制
AChartEngine Android 平台的图表开发库, 能绘制 折线图, 饼图, 气泡图, 柱状图, 散点图, 面积图等统计图表. 这些我记录一下,柱状图.折线图和饼状图的小例子.有兴趣的朋友, ...
- Android test---CTS
转载 1.下载最新的CTS download 2.准备工作 3.启动CTS测试 3.1 在控制台进入目录android-cts,目录android-cts下有三个文件夹,其中一个是tools. 3.2 ...
- openstack vm_lifecycle
nova instance状态:power_state, vm_state, task_state 2015-09-22 Openstack 185 nova instance有3种状态:power_ ...
- Unity IOC简单认知
看了不少IOC的文章.简单概念梳理下. 1.依赖,依赖倒置,控制反转(IOC),依赖注入 解释是仿照http://www.cnblogs.com/qqlin/archive/2012/10/09/27 ...
- Android启动标记
1. Task是包含一系列Activity的堆栈, 遵循先进后出原则. 2. Task默认行为: (1) 前提: Activity A和Activity B在同一个应用中. 操作: Activity ...
- Appium常见问题(持续更新)
1.Original error: Could not parse activity from dumpsys 命令行:adb shell dumpsys cpuinfo 报:service du ...
- Spring概念
1.控制反转IOC:即生成对象,相当于new的功能,用IOC有利于维护. 2.依赖注入DI:即给属性赋值,相当于JavaBean的setter方法. 3.面向切面方程AOP:使得各个切面和目标类完全松 ...
- ubuntu客户端使用RDP协议连接windows服务器
如果服务器是linux或unix,可以使用ssh远程连接服务器.也有服务器是windows的,通常使用RDP协议进行连接. 1 环境 客户端:ubuntu14.04 LST 服务器:windows ...
- phpstorm 16.1 注册码
phpstorm 2016.1 的注册与phpstorm 10 相同,可以采用:“服务器注册” 方式进行注册,又快又方便. 服务器注册:http://idea.qinxi1992.cn IDEA 20 ...