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),但是反过来,不能从身 ...
随机推荐
- 后台数据库读取Html值 到前台显示不了样式
@Html.Raw(FieldValue) 像一些Html代码 传到前台编译不了,直接显示出来 FieldValue 是后台传过来的值 viewBag
- js的事件的绑定
js的绑定事件 绑定事件有什么用,当你一个按钮点击时需要执行2个函数,就可以用绑定事件,一般只有没绑定事件增加两个onclick函数,第二会覆盖第一个函数的. <!DOCTYPE html> ...
- SQLyog-直接导出JSON格式的数据
前言:以前做过的一个项目,有这样的一个需求使用搜索引擎来查询对应的区域信息,不过区域信息要先导出来,并且数据格式是JSON格式的,在程序中能实现这个需求,不过下面的这种方法更加的简单,通过 ...
- JS-获取URL请求参数
前言:原来做过一个项目,需要实现一个页面打印的功能,由于项目中使用了AngularJS+Bootstrap等前端框架,需要打印的页面又在弹出框中,使用了Bootstrap的模态框后发现打印的效果不太好 ...
- GMM的EM算法实现
转自:http://blog.csdn.net/abcjennifer/article/details/8198352 在聚类算法K-Means, K-Medoids, GMM, Spectral c ...
- RabbitMQ消息机制广播分发
public static void SendMessage() { var factory = new ConnectionFactory(); factory.HostName = "1 ...
- leetcode-【中等题】5. Longest Palindromic Substring
题目 Given a string S, find the longest palindromic substring in S. You may assume that the maximum le ...
- 比较常用的几个maven第三方镜像
OSC的:<mirror> <id>CN</id> <name>OSChina Central</name> ...
- [转载]Average Manager vs. Great Manager Explained in 10 sketches
Assigning Tasks Delivering News Conducting 1:1s Giving Feedback Dealing with Turbule ...
- VS有效序列号
VS2005 : KYTYH-TQKW6-VWPBQ-DKC8F-HWC4J VS2008 : PYHYP-WXB3B-B2CCM-V9DX9-VDY8T VS2010 : YCFHQ-9DWCY-D ...