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

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

对于人在数据创建表的时候,我们就给他两个字段,一个是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. 万能头文件#include <bits/stdc++.h>

    最近在做题的时候看到别人的题解发现别人都用这个 突然之间打开新世界的大门 去百度之后才知道#include <bits/stdc++.h>包含了目前所有的c++头文件 也就是说只要用#in ...

  2. django天天生鲜项目

    .后台admin管理天天生鲜商品信息 models里 from django.db import modelsfrom tinymce.models import HTMLField #需要pip安装 ...

  3. Network in Network 个人理解

    关键点是1*1的卷积是怎么用的,也就是MLP卷积.看如下的数据就可以理解了 输入为224*224*3的图像,第一层卷积为11*11*3*96(也就是96个11*11*3的卷积核,另外还有步长),卷积完 ...

  4. 使用PerfView监测.NET程序性能(一):Event Trace for Windows

    前言: 在日常项目开发中,我们时不时会遇到程序占用了很高CPU的情况,可能是程序里某些未经优化的代码或者Bug,或者是程序运行压力太大.无论是什么原因,我们总希望能看到到底是哪个方法占用了如此高的CP ...

  5. dialog里屏蔽ESC和回车

    重载PreTranslateMessage,在return之前加一句判断,只要是按下ESC和回车的消息,就直接置之不理即可,代码如下: if( pMsg->message == WM_KEYDO ...

  6. 单片机编译器Keil提供的sprintf有点问题

    AduC70xx系列,Keil提供的sprintf函数不太好用,好像有时会引起内存泄漏,造成不可预知的死机情况出现.

  7. 【CS】笔试常见题目

    网络 IP地址分类 常见网络协议 HTTP状态码 算法 排序问题总结 git git和svn的区别 git常用命令 git暂存区,工作区等 一.网络 1. IP地址分类: IP网络使用32位地址,以点 ...

  8. git常用命令常用场景

    在使用git之前,一直用的是svn版本管理:与svn最大不同的是,git有两个仓库,一个是本地仓库,一个是服务器上共享的仓库:本地仓库是每个开发者自己独有的,即使commit提交也只是提交到本地仓库: ...

  9. Akka(20): Stream:异步运算,压力缓冲-Async, batching backpressure and buffering

    akka-stream原则上是一种推式(push-model)的数据流.push-model和pull-model的区别在于它们解决问题倾向性:push模式面向高效的数据流下游(fast-downst ...

  10. 学习使用Apollo配置中心

    Apollo(阿波罗)是携程框架部门研发的配置管理平台,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端. Apollo官网地址 如何安装服务端可以按照上面官网的步骤. 这里 ...