Hibernate关联关系映射之一对一(主键关联)
在业务成的域模型中,类和类之间最普遍的关系就是关联关系,而关联也是有方向的。
就以例子来说明:一个人对应一张身份证。对其进行增删改。
对于人在数据创建表的时候,我们就给他两个字段,一个是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关联关系映射之一对一(主键关联)的更多相关文章
- Hibernate关联映射1:一对一主键关联
2张表之间通过主键形成一对一映射关系,如一个人只能有一张身份证: t_identity_card表建表语句: CREATE TABLE `t_identity_card` ( `id` int(11) ...
- Hibernate,关系映射的多对一单向关联、多对一双向关联、一对一主键关联、一对一外键关联、多对多关系关联
2018-11-10 22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate ...
- 010一对一 主键关联映射_双向(one-to-one)
² 两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ² 有两种策略可以实现一对一的关联映射 主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库 ...
- 009一对一 主键关联映射_单向(one-to-one)
009一对一 主键关联映射_单向(one-to-one) ² 两个对象之间是一对一的关系,如Person-IdCard(人—身份证号) ² 有两种策略可以实现一对一的关联映射 主键关联:即让两个 ...
- Hibernate5.2之一对一主键关联(四)
Hibernate5.2之一对一主键关联(四) 一.简介 一对一关联关系分为两种:a.主键关联:b. ...
- hibernate5(12)注解映射[4]一对一外键关联
在实际博客站点中,文章内容的数据量非常多,它会影响我们检索文章其他数据的时间,如查询公布时间.标题.类别的等. 这个时候,我们能够尝试将文章内容存在还有一张表中,然后建立起文章--文章内容的一对一映射 ...
- Hibernate注解:一对一主键关联
情形:两个表,my_site和my_site_company,通过主键site_id唯一关联.my_site的主键是自动增加,my_site_company的主键依赖于my_site. # # Sou ...
- hibernate 关系映射之 双向外键关联一对一
在上一篇博客内容的基础上做了以下修改,即可实现. 注解方式: package com.bjsxt.hibernate; import javax.persistence.Entity; imp ...
- hibernate 关系映射之 单向外键关联一对一
这里的关系指的是对象与对象之间的关系 注解方式单向关联一对一: //这个类描述的husband是一个对应一个wife的 import javax.persistence.Entity; import ...
随机推荐
- noip第6课作业
1. 数据统计 [问题描述] 输入N个整数,求出它们的最小值.最大值和平均值(保留3位小数).输入保证这些数都是不超过1000的整数.(1<=N<=1000) [样例输入] 8 2 ...
- 谈谈HashMap线程不安全的体现
原文出处: Hosee HashMap的原理以及如何实现,之前在JDK7与JDK8中HashMap的实现中已经说明了. 那么,为什么说HashMap是线程不安全的呢?它在多线程环境下,会发生什么情况呢 ...
- js跳转页面方法实现汇总
一.页面之间的跳转传参 1.在页面之间跳转的方式有两种: window.location.href=”test.html?num=10” 地址会改变参数也会被传递但是不会打开新窗口 window. ...
- AngularJS ngTemplate寄宿方式 模板缓存 $templateCache
AngularJS的指令中经常定义模板(template或templateUrl),可以选择将Html模板直接寄宿在WEB容器中,如Tomcat.IIS.Nginx.NodeJs Express,也可 ...
- ASP.NET MVC Form表单验证与Authorize特性
一.Form表单验证 1.基本概念 表单验证是一个基于票据(ticket-based)[也称为基于令牌(token-based)]的系统.当用户登录系统以后,会得到一个包含基于用户信息的票据(tick ...
- MFC坐标系
MFC坐标系分为设备坐标系和逻辑坐标系两种.在设备坐标系中,一个像素表示一个单位长度,设备的原点(0,0)始终在显示平面的左上角位置,x轴正向向右,y轴正向向下. 逻辑坐标系中,原点可以放在任何一个位 ...
- cocos游戏的例子(摘抄记录,非原创)
3.1 搭建Cocos2d-JS v3.x 开发环境 下载所需的软件包 下载 Cocos Code IDE.目前 Cocos Code IDE 最新发布版本是 1.0.0-RC2.我们为什么 Coco ...
- [logic]逻辑整理
圈子详情页面: 1.加入圈子(*) 1.已登录,直接添加 2.未登录,登陆框 2.发表新帖(*) 1.已登录,直接跳转 2.未登录, ...
- nips 2016 吴恩达
一年一度的 NIPS 又来了.今年举办地是笔者最爱的欧洲城市巴塞罗那.阳光沙滩配学术,确实很爽.这次的会议的第一天开场的大部分时间安排给了 tutorial.其中人数爆满的依旧是吴恩达(AndrewN ...
- 索引视图DEMO1
--use tempdb ----------------------在创建视图和所有底层表时,必须打开ANSI_NULLS以及QUOTED_IDENTIFIER选项 --SET ANSI_NULLS ...