每一个人(Person)对应一个身份证号(IdCard)
 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一对一双向关联(注解)的更多相关文章

  1. Hibernate一对一双向关联映射

    关键原因在于对象模型具有方向性: 单向:一端只能加载另一端,不能反过来. 双向:两端都可以加载另一端. 问题来了:如何我们想从身份证端(IdCard)加载人(Person),怎么办呢? 下面我们开始介 ...

  2. Hibernate一对一双向关联(外键)

    网站上各种搜索,都是一些清晰或者不清晰的例子,但是用下来一是确实不给力,二是完全不知道所以然. 后来终于在书中查到了就在这里记一下. 首先要说明,这里只解释双向一对一只有一个表里面有外键的情况. 就以 ...

  3. Hibernate 一对一双向映射 注解方式

    有外键的一方: @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "courseid") public Tcourse ge ...

  4. Java进阶知识07 Hibernate一对一双向外键关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.创建Husband类和Wife类 package com.shore.model; import javax.persistence.Entity; impo ...

  5. Hibernate从入门到精通(六)一对一双向关联映射

    在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射,这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映射所不同的的 ...

  6. HIBERNATE一对一双向外键联合主键关联

    HIBERNATE一对一双向外键联合主键关联: 一. 创建主键类:这个主键必须实现serializedable接口和重写其中的hashCode方法和equals方法:为主键类添加一个叫做@Embedd ...

  7. Hibernate(六)一对一双向关联映射

    在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射, 这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映 射所不同 ...

  8. (Hibernate进阶)Hibernate映射——一对一双向关联映射(六)

    上一篇博客我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.如图所示: 关键原因在于对象模型具有方向性: 单向: ...

  9. 【SSH系列】hibernate映射 -- 一对一双向关联映射

    开篇前言 上篇博文[SSH进阶之路]hibernate映射--一对一单向关联映射,小编介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身 ...

随机推荐

  1. (Hibernate进阶)Hibernate映射——一对多关联映射(七)

    一对多关联映射 映射原理 一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端.关联关系都是由多端维护,只是在写映射时发生了变化. 多对一和一对多的区别 多对一和 ...

  2. LR12.53—第2课:准备脚本重播

    第2课:准备脚本重播 创建Vuser脚本后,可以通过从VuGen中运行它验证它.有时重播将失败,即使同样的动作在录制过程中取得了成功. 许多应用程序使用,每次使用应用​​程序时更改动态值.例如,某些服 ...

  3. vi/vim 的使用

    vi/vim 的使用 基本上 vi/vim 共分为三种模式,分别是一般模式.编辑模式与指令列命令模式. 这三种模式的作用分别是: 一般模式:以 vi 打开一个档案就直接进入一般模式了(这是默认的模式) ...

  4. Thinkphp源码分析系列(九)–视图view类

    视图类view主要用于页面内容的输出,模板调用等,用在控制器类中,可以使得控制器类把表现和数据结合起来.下面我们来看一下执行流程. 首先,在控制器类中保持着一个view类的对象实例,只要继承自控制器父 ...

  5. Linux cache释放

    cache释放: To free pagecache: > /proc/sys/vm/drop_caches To free dentries and inodes: > /proc/sy ...

  6. java学习第12天

    今天主要是看下正则表达式,其实在编译原理中就接触过.正则表达式就是符合一定规则的字符串. A:字符 x 字符 x.举例:'a'表示字符a \\ 反斜线字符. \n 新行(换行)符 ('\u000A') ...

  7. location.hash详解

    一.#的涵义 #代表网页中的一个位置.其右面的字符,就是该位置的标识符.比如, http://www.example.com/index.html#print 就代表网页index.html的prin ...

  8. Jquery day02

    jquery day01回顾 语法: $("选择器")        , $(dom对象) , $("<div>") 选择器: 基本:#id.ele ...

  9. 使用Birt开发报表

    间隔一段时间未使用Birt开发报表后,本文章记录Birt开发报表的常遇到的开发问题及解决措施,方便自己和园内其他朋友学习. 一.Birt连接数据库配置 1.连接DB2数据库: 1.1.birt的数据连 ...

  10. 关于subGradent descent和Proximal gradient descent的迭代速度

    clc;clear; D=1000;N=10000;thre=10e-8;zeroRatio=0.6; X = randn(N,D); r=rand(1,D); r=sign(1-2*r).*(2+2 ...