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

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

对于人在数据创建表的时候,我们就给他两个字段,一个是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. 第84讲:Scala中List和ListBuffer设计实现思考

    今天来学习了scala中的list和ListBuffer scala list 内部很多操作是listbuffer做的,因为改变元素,listbuffer非常高效,tl是var类型的  ,但是他属于s ...

  2. EndNote安装

    下载地址:https://download.csdn.net/download/noticeable/10283841 EndNote X8.1是一款功能强大的文献管理软件,软件在x8版本中继承了国际 ...

  3. 2、GCC编译器的使用

    GCC编译器是一个非常强大和流行的C编译器,适用于各种Linux发行版.本文解释了一些流行的GCC编译器选项. GCC编译器选项 1.指定输出可执行文件名称 在最基本的形式中,gcc编译器可以用作: ...

  4. hdu 4964 恶心模拟

    http://acm.hdu.edu.cn/showproblem.php?pid=4964 给定语句,按照语法翻译html并输出. 就是恶心的模拟,递归搞就行了 处理id和class时,在一个'&g ...

  5. java基础知识-二进制

    1.二进制<0B>出现的原因 2. 八进制<0>和十六进制<0X>出现的原因:简化书写和记忆 3.十进制到其他进制的转换方法 method:除以进制数,直到商为0, ...

  6. day01_雷神_Python入门

    day01 1.编程语言 主流的像C.java.python.php.C#.等,可以从不同维度分类如下: 机器码和字节码 机器码: C 字节码: 其他 note: 机器码是电脑的CPU可直接解读的数据 ...

  7. 用fastreport在进行多列打印时,默认是先行后列,如何改成先列后行排记录?

    例子程序中的6.fr3是在Page中设置 columns=2这样就是先行后列,7.fr3就是3列先列后行的例子 1     6 2     7 3     8 4     9 5     10 但如果 ...

  8. 【vue】项目编译报错‘npm ERR! **@**dev: `webpack-dev-server --inline --progress --config ’’

    关于npm ERR! **@**dev: `webpack-dev-server --inline --progress --config‘ 原因:这是新版webpack存在的BUG,卸载现有的新版本 ...

  9. 网络流——最大流Dinic算法

    前言 突然发现到了新的一年什么东西好像就都不会了凉凉 算法步骤 建残量网络图 在残量网络图上跑增广路 重复1直到没有增广路(注意一个残量网络图要尽量把价值都用完,不然会浪费建图的时间) 代码实现 #i ...

  10. springboot2 生产部署注意事项【持续更新】

    注意事项1. 去除不需要的 jar 开发工具 jar :springs-boot-devtools2. 监控一定要做好权限制或者去除 控制 jar :spring-boot-starter-actua ...