在业务成的域模型中,类和类之间最普遍的关系就是关联关系,而关联也是有方向的。

就以例子来说明:一个人对应一张身份证。对其进行增删改。

对于人在数据创建表的时候,我们就给他两个字段,一个是id号,一个就是名字。

那么对于身份证也就是两个字段,一个对应于一个人相同的id号,一个就是身份证码。

1 那么来创建数据库表:

人为主表,身份证为从表。

 create table person(
id bigint primary key auto_increment,
userName varchar(20)
); create table card(
id bigint primary key,
cardNo varchar(18)
);

创建实体类的时候,人要引用身份证卡的信息,同样身份证卡也要引用人这个类。

2 那么来创建实体类:

人:

 package com.cy.beans;

 import java.io.Serializable;

 public class Person implements Serializable {

     private static final long serialVersionUID = 1L;
private long id;
private String userName;
private Card card;// 卡 一对一关联 public void person() { } public long getId() {
return id;
} public void setId(long id) {
this.id = id;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public Card getCard() {
return card;
} public void setCard(Card card) {
this.card = card;
} @Override
public String toString() {
return "Person [id=" + id + ", userName=" + userName + ", card=" + card
+ "]";
} }

身份证:

 package com.cy.beans;

 import java.io.Serializable;

 public class Card implements Serializable{

     private static final long serialVersionUID = 1L;

     private long id;
private String cardNo;
private Person person;//人 一对一关联 public Card(){ }
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getCardNo() {
return cardNo;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
@Override
public String toString() {
return "Card [id=" + id + ", cardNo=" + cardNo + ", person=" + person
+ "]";
} }

现在创建映射文件

Person.hbm.xml

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.cy.beans.Person" table="person" catalog="j2ee"> <!-- catalog数据库 --> <id name="id" type="java.lang.Long"><!-- 此行的ID,为对象的属性ID -->
<column name="id"></column><!-- 此行的ID,为表字段ID -->
<generator class="increment"></generator><!-- 给id指定生成策略 -->
</id> <property name="userName" type="java.lang.String">
<column name="userName"></column>
</property> <!--站在主对象的一方来设置级联关系 -->
<!-- cascade定义的是关系两端对象到对象的级联关系,cascade有四個取值,all,none,save-update,delete
all : 所有情况下均进行关联操作。
none:所有情况下均不进行关联操作。这是默认值。
save-update:在执行save/update/saveOrUpdate时进行关联操作。
delete:在执行delete时进行关联操作。 -->
<one-to-one name="card" class="com.cy.beans.Card" cascade="all"></one-to-one> </class> </hibernate-mapping>

Card.hbm.xml

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping>
<class name="com.cy.beans.Card" table="card" catalog="j2ee"> <!-- catalog数据库 -->
<id name="id" type="java.lang.Long"><!-- 此行的ID,为对象的属性ID -->
<column name="id"></column><!-- 此行的ID,为表字段ID -->
<generator class="foreign"><!-- foreign主键生成器 -->
<param name="property">person</param><!--类属性 -->
</generator>
</id> <property name="cardNo" type="java.lang.String">
<column name="cardNo"></column>
</property>
<!--站在从对象的一方来设置交出约束 -->
<!-- name:一对一节点 ,constrained: 约束(必须为true) -->
<one-to-one name="person" class="com.cy.beans.Person" constrained="true"></one-to-one> </class>
</hibernate-mapping>

在hibernate.cfg.xml里添加对象xml文件:

1         <mapping resource="com/cy/xmls/Person.hbm.xml"/>
<mapping resource="com/cy/xmls/Card.hbm.xml"/>

工具类:

 package com.cy.tools;

 import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry; /**
* session工厂的工具类
* @author acer
*
*/ public class HibernateUtils { private static Configuration cfg;
private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry; static{ cfg = new Configuration().configure();
serviceRegistry = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build();
sessionFactory = cfg.buildSessionFactory(serviceRegistry); } public static SessionFactory getSessionFactory(){
return sessionFactory;
} }

IPersonDao.java接口,定义方法:

 package com.cy.dao;

 import java.io.Serializable;

 import com.cy.beans.Person;

 public interface IPersonDao {
/**
* 添加
* @param p
*/
public void savePerson(Person p);
/**
* 修改
* @param p
*/
public void updatePerson(Person p);
/**
* 刪除
* @param p
*/
public void deletePerson(Person p);
/**
* 根据id查询数据
* @param cls
* @param pk
* @return
*/
public Person getPerson(Class<?> cls,Serializable pk); public void findPerson(Person p); }

写接口实现:PersonDaoImpl.java

 package com.cy.dao.impl;

 import java.io.Serializable;

 import org.hibernate.Session;
import org.hibernate.Transaction; import com.cy.beans.Person;
import com.cy.dao.IPersonDao;
import com.cy.tools.HibernateUtils; public class PersonDaoImpl implements IPersonDao { @Override
public void savePerson(Person p) {
//获得Session
Session session=null;
Transaction transaction=null; try {
session=HibernateUtils.getSessionFactory().openSession();//
transaction=session.beginTransaction();//开启事务
session.save(p);//添加
transaction.commit();//提交事务
} catch (Exception e) {
e.printStackTrace();
transaction.rollback();//回滚事务
}finally{
session.close();//关闭session
} } @Override
public void updatePerson(Person p) {
Session session=null;
Transaction transaction=null; try {
session=HibernateUtils.getSessionFactory().openSession();
transaction=session.beginTransaction();
session.update(p);//修改
transaction.commit();
} catch (Exception e) {
e.printStackTrace();
transaction.rollback();
}finally{
session.close();
} } @Override
public Person getPerson(Class<?> cls, Serializable pk) {
Session session=null;
Transaction transaction=null;
Person person=null;
try {
session=HibernateUtils.getSessionFactory().openSession();
transaction=session.beginTransaction();
person=(Person) session.get(cls, pk);//根据id查询。pk这里指的就是id
transaction.commit(); } catch (Exception e) {
e.printStackTrace();
transaction.rollback();
}finally{
session.close();
} return person;
}
@Override
public void deletePerson(Person p) {
Session session=null;
Transaction transaction=null; try {
session=HibernateUtils.getSessionFactory().openSession();
transaction=session.beginTransaction();
session.delete(p);//删除
transaction.commit();
} catch (Exception e) {
e.printStackTrace();
transaction.rollback();
}finally{
session.close();
} } @Override
public void findPerson(Person p) { } }

写IPersonServer.java接口

 package com.cy.server;

 import java.io.Serializable;

 import com.cy.beans.Person;

 public interface IPersonServer {
/**
* 添加
* @param p
*/
public void savePerson(Person p);
/**
* 修改
* @param p
*/
public void updatePerson(Person p);
/**
* 刪除
* @param p
*/
public void deletePerson(Long id);
/**
* 根据id查询
* @param cls
* @param pk
* @return
*/
public Person getPerson(Class<?> cls,Serializable pk); public void findPerson(Person p);
}

写PersonServerImpl.java实现;

 package com.cy.server.impl;

 import java.io.Serializable;

 import com.cy.beans.Person;
import com.cy.dao.IPersonDao;
import com.cy.dao.impl.PersonDaoImpl;
import com.cy.server.IPersonServer; public class PersonServerImpl implements IPersonServer {
IPersonDao dao = new PersonDaoImpl(); @Override
public void savePerson(Person p) {
dao.savePerson(p); } @Override
public void updatePerson(Person p) {
dao.updatePerson(p);
} @Override
public void deletePerson(Long id) {
Person p = dao.getPerson(Person.class, id);
if (p != null) {
dao.deletePerson(p);
} } @Override
public Person getPerson(Class<?> cls, Serializable pk) { return dao.getPerson(cls, pk);
} @Override
public void findPerson(Person p) { } }

写个PersonAction测试;

 package com.cy.action;

 import com.cy.beans.Card;
import com.cy.beans.Person;
import com.cy.server.IPersonServer;
import com.cy.server.impl.PersonServerImpl; public class PersonAction {
public static void main(String[] args) { // savePerson();
// updatePerson();
deletePerson();
} private static void deletePerson() {
IPersonServer ps=new PersonServerImpl();
ps.deletePerson(Long.valueOf(1)); } private static void updatePerson() {
IPersonServer ps=new PersonServerImpl();
Person p=ps.getPerson(Person.class, Long.valueOf(1));
p.setUserName("小紅");
ps.updatePerson(p);
/*Hibernate: //这些hibernate所执行语句 修查询 后修改
select
person0_.id as id1_1_0_,
person0_.userName as userName2_1_0_,
card1_.id as id1_0_1_,
card1_.cardNo as cardNo2_0_1_
from
j2ee.person person0_
left outer join
j2ee.card card1_
on person0_.id=card1_.id
where
person0_.id=?
Hibernate:
update
j2ee.person
set
userName=?
where
id=?
Hibernate:
update
j2ee.card
set
cardNo=?
where
id=?
*/ } private static void savePerson() {
IPersonServer ps=new PersonServerImpl();
Person p=new Person();
p.setUserName("小明");
Card c=new Card();
c.setCardNo("511123************");
//設置相互
p.setCard(c);
c.setPerson(p);
ps.savePerson(p);
/*Hibernate: 添加时 先查询主表的最大的id,先添加主表,在添加从表。 删除时则是先删除从表,在删除主表。
select
max(id)
from
person
Hibernate:
insert
into
j2ee.person
(userName, id)
values
(?, ?)
Hibernate:
insert
into
j2ee.card
(cardNo, id)
values
(?, ?) */ }
}

Hibernate关联关系映射之一对一(主键关联)的更多相关文章

  1. Hibernate关联映射1:一对一主键关联

    2张表之间通过主键形成一对一映射关系,如一个人只能有一张身份证: t_identity_card表建表语句: CREATE TABLE `t_identity_card` ( `id` int(11) ...

  2. Hibernate,关系映射的多对一单向关联、多对一双向关联、一对一主键关联、一对一外键关联、多对多关系关联

    2018-11-10  22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate ...

  3. 010一对一 主键关联映射_双向(one-to-one)

    ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...

  4. 009一对一 主键关联映射_单向(one-to-one)

    009一对一  主键关联映射_单向(one-to-one) ²  两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ²  有两种策略可以实现一对一的关联映射 主键关联:即让两个 ...

  5. Hibernate5.2之一对一主键关联(四)

                                                      Hibernate5.2之一对一主键关联(四) 一.简介 一对一关联关系分为两种:a.主键关联:b. ...

  6. hibernate5(12)注解映射[4]一对一外键关联

    在实际博客站点中,文章内容的数据量非常多,它会影响我们检索文章其他数据的时间,如查询公布时间.标题.类别的等. 这个时候,我们能够尝试将文章内容存在还有一张表中,然后建立起文章--文章内容的一对一映射 ...

  7. Hibernate注解:一对一主键关联

    情形:两个表,my_site和my_site_company,通过主键site_id唯一关联.my_site的主键是自动增加,my_site_company的主键依赖于my_site. # # Sou ...

  8. hibernate 关系映射之 双向外键关联一对一

    在上一篇博客内容的基础上做了以下修改,即可实现.   注解方式:   package com.bjsxt.hibernate; import javax.persistence.Entity; imp ...

  9. hibernate 关系映射之 单向外键关联一对一

    这里的关系指的是对象与对象之间的关系 注解方式单向关联一对一: //这个类描述的husband是一个对应一个wife的 import javax.persistence.Entity; import ...

随机推荐

  1. 怎样去写线程安全的代码(Java)

    使用多线程就可能会存在线程安全的问题.很多 java 程序员对写多线程都很挣扎,或者仅仅理解那些是线程安全的代码,那些不是.这篇文章我并不是详述线程安全,详述同步机制的文章,相反我只是用一个简单的非线 ...

  2. spring boot学习笔记2

    开场知识: spring 容器注入bean,时容器初始化的一些接口以及接口调用的时间先后顺序: 1)BeanFactoryPostProcessor 容器初始化的回调方法 * BeanFactoryP ...

  3. Delphi TStringHelper用法详解

    Delphi TStringHelper用法详解 (2013-08-27 22:45:42) 转载▼ 标签: delphi_xe5 it 分类: Delphi Delphi XE4的TStringHe ...

  4. dev gridview自动列宽和单元、行、checkbox选中和多选

    #region 自动列宽 for (int I = 0; I < gridView1.Columns.Count; I++) { this.gridView1.BestFitColumns(); ...

  5. EF查询某个时间段内的数据遇到坑!

    第一个问题 var res = pwDb.Set<WorkInfo>().Where(t => t.WorkTime > startTime && t.Work ...

  6. MVC所有的ActionResult

    一.所有的Controller都继承自System.Web.Mvc.Controller 目前ASP.NET MVC3默认提供了多种ActionResult的实现,在System.Web.Mvc命名空 ...

  7. 使用jQuery实现一个类似GridView的编辑,更新,取消和删除的功能

    先来看看下面实时效果演示: 用户点击编辑时,在点击行下动态产生一行.编辑铵钮变为disabled.新产生的一行有更新和取消的铵钮,点击“取消”铵钮,删除刚刚动态产生的行.编辑铵钮状态恢复. 更新与删除 ...

  8. 2018-2019-2 20175230 实验三《Java面向对象程序设计》实验报告

    目录 实验三 实验三 敏捷开发与XP实践 实验内容 实验要求 实验步骤 (一) 编码标准 (二)敏捷开发与XP (三)敏捷开发与XP 实验体会 实验三 实验三 敏捷开发与XP实践 实验内容 1.XP基 ...

  9. cad2016卸载/安装失败/如何彻底卸载清除干净cad2016注册表和文件的方法

    cad2016提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装cad2016失败提示cad2016安装未完成,某些产品无法安装,也有时候想重新安装cad2016 ...

  10. Vue 项目配置

    配置Vue的app项目首先需要配置本地环境. 1.下载node.js并且安装.(根据自己电脑参数进行选择) 打开cmd,检查是否安装成功. 分别输入: node -v npm -v 结果如图正确显示出 ...