`

Hibernate一对一数据关联

阅读更多
(1)一对一关联

例如:一个人有一份个人资料。应该有两张表,一张是个人表,另外一张是信息表

create table personInfo

(

uid int identity(1,1) primary key,

name varchar(20) not null,

age int not null

)

create table info

(

id int,

address varchar(100) not null,

tel varchar(100) not null,

email varchar(100) not null

foreign key(id) references personInfo(uid) on delete cascade

)

此时被关联的表存在多个字段,所以此时建立POJO类的时候肯定要建立两个POJO类

PersonInfo 中应该包含Info属性,而Info类中要包含PersonInfo属性

PersonInfo.java

public class PersonInfo {

private int uid;

private String name;

private int age;

private Info info;

public Info getInfo() {

return info;

}

public void setInfo(Info info) {

this.info = info;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getUid() {

return uid;

}

public void setUid(int uid) {

this.uid = uid;

}

}

Info.java:

public class Info {

private int id;

private String address;

private String tel;

private String email;

private PersonInfo personInfo;

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public PersonInfo getPersonInfo() {

return personInfo;

}

public void setPersonInfo(PersonInfo personInfo) {

this.personInfo = personInfo;

}

public String getTel() {

return tel;

}

public void setTel(String tel) {

this.tel = tel;

}

}

但是两个类的关系如果想要正确,还必须配置映射文件。

PersonInfo.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<class name="collection.PersonInfo" table="personInfo" catalog="myshop" schema="dbo">

<id name="uid" type="java.lang.Integer">

<column name="uid"></column>

<generator class="native"></generator>

</id>

<property name="name" type="java.lang.String">

<column name="name" length="20" not-null="true"></column>

</property>

<property name="age" type="java.lang.Integer">

<column name="age" not-null="true"/>

</property>


<one-to-one name="info" class="collection.Info" cascade="all"></one-to-one>

</class>

</hibernate-mapping>


Info.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<class name="collection.Info" table="info" catalog="myshop" schema="dbo">

<id name="id" type="java.lang.Integer">

<column name="id"></column>

<generator class="foreign">

<param name="property">personInfo</param>

</generator>

</id>

<property name="address" type="java.lang.String">

<column name="address" length="100" not-null="true"/>

</property>

<property name="tel" type="java.lang.String">

<column name="tel" length="100" not-null="true"/>

</property>

<property name="email" type="java.lang.String">

<column name="email" length="100" not-null="true"></column>

</property>

<one-to-one name="personInfo" class="collection.PersonInfo"></one-to-one>

</class>

</hibernate-mapping>

public void doCreate()

{

PersonInfo p=new PersonInfo();

p.setName("小七");

p.setAge(20);

Info info=new Info();

info.setAddress("北京");

info.setTel("13260100334");

info.setEmail("[B: adfk@dfkl.com[/B]]adfk@dfkl.com");

p.setInfo(info);

info.setPersonInfo(p);

session.save(p);

session.beginTransaction().commit();

session.close();

}

程序执行后,只执行一条SQL语句。

因为程序中没有配置级联关系,所以在插入的时候虽然 在类中配置好了,但程序依然不会插入护照信息。

<one-to-one name="info" class="collection.Info" cascade="all"></one-to-one>

观察结果:

public void find1()

{

String hql="FROM PersonInfo p where p.uid=6";

PersonInfo p=(PersonInfo)session.createQuery(hql).uniqueResult();

System.out.println(p.getName());

System.out.println(p.getInfo().getAddress());

}


执行两条查询语句


public void find2()

{

PersonInfo p=(PersonInfo)session.get(PersonInfo.class, new Integer(6));

System.out.println(p.getName());

System.out.println(p.getInfo().getAddress());

}

执行一条查询语句

更新操作:

public void doUpdate1()

{

PersonInfo p=new PersonInfo();

p.setUid(6);

p.setName("小八");

p.setAge(20);

Info info=new Info();

info.setAddress("河南");

info.setTel("13260100334");

info.setEmail("[B: adfk@dfkl.com[/B]]adfk@dfkl.com");

p.setInfo(info);

info.setPersonInfo(p);

session.update(p);

session.beginTransaction().commit();

session.close();

}

以上是一个新的实体,进行更新操作。

执行SQL语句:

Hibernate: insert into myshop.dbo.info (address, tel, email, id) values (?, ?, ?, ?)

Hibernate: update myshop.dbo.personInfo set name=?, age=? where uid=?

出现两个记录,导致垃圾数据

更新的时候如果配置好了级联关系,则可能会执行插入新记录的操作。


public void doUpdate2()

{

PersonInfo p=(PersonInfo)session.get(PersonInfo.class, new Integer(7));

p.setName("小八");

p.setAge(20);

p.getInfo().setAddress("地球");

p.getInfo().setTel("23423423");

p.getInfo().setEmail("[B: adfa@aldf.com[/B]]adfa@aldf.com");

session.update(p);

session.beginTransaction().commit();

session.close();

}

执行的SQL语句:

Hibernate: update myshop.dbo.info set address=?, tel=?, email=? where id=?

Hibernate: update myshop.dbo.personInfo set name=?, age=? where uid=?

因为是先查询出来的实体,所以保存了对象的状态,更新的时候就不会进行插入的了

以上都是使用update方法来完成的,本身不建议这样使用,最好使用HQL中update方法。
分享到:
评论

相关推荐

    hibernate一对一关联关系

    本资源主要探讨的是“hibernate一对一关联关系”。 一对一关联关系在现实世界中很常见,比如一个人只有一个身份证,或者一个公司的总部只有一个。在Hibernate中,设置一对一关联关系可以帮助我们更好地管理和操作...

    Hibernate双向一对一关联映射(注解版)

    本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的数据库设计模式,用于处理两个实体之间一对一的关系。 在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有...

    hibernate一对一主键关联映射(单项关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是一种常见的关系数据库模型。本篇将深入探讨在Hibernate中实现一对一主键关联映射的单项关联方式。这种关联意味着两个实体类共享相同的主键,即一个...

    Hibernate一对一唯一外键关联映射(双向关联)

    一、Hibernate一对一关联类型 一对一关联在现实世界中很常见,例如一个人只有一个身份证,一个身份证也只能属于一个人。在数据库设计中,这种关系通常通过主键和外键的方式实现,其中一方的主键作为另一方的外键,...

    Hibernate一对一主键关联映射(单向关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的关系映射方式之一,尤其在处理两个实体之间存在唯一对应关系时非常有用。本篇将重点讲解如何实现一对一主键关联映射的单向关联,并通过一个...

    Hibernate一对一主键关联映射(双向关联)

    标题"Hibernate一对一主键关联映射(双向关联)"中的"主键关联"指的是两个实体通过共享相同的主键来建立关联。"双向关联"则意味着在两个实体类中,都可以直接访问到对方的实例,即在实体A中有一个对实体B的引用,...

    Hibernate一对一,一对多,多对多实例

    本实例将深入探讨Hibernate中的三种基本关联关系:一对一(One-to-One)、一对多(One-to-Many)以及多对多(Many-to-Many)的实现方式。 1. **一对一关联**: 一对一关联通常出现在两个实体之间存在唯一对应关系...

    Hibernate 一对一关联查询.docx

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联查询是一种常见的关系映射方式,用于表示两个实体之间一对一的依赖关系。这种关联通常在数据库中通过外键或者主键来实现。本文将深入探讨基于外键的一对一...

    hibernate一对一之唯一外键关联(双向关联)

    - 在一对一关联中,唯一外键关联是指在一个实体中定义了另一个实体的主键作为其字段,形成外键约束,确保了数据的一致性和完整性。 3. **双向关联与单向关联** - **单向关联**:只有一方知道另一方的存在,例如...

    hibernate使用主键关联的一对一关系

    总之,理解并正确实现Hibernate中的一对一主键关联对于优化数据模型和提高代码的可维护性至关重要。通过共享主键,我们可以确保数据的完整性和一致性,同时简化对象之间的交互。阅读提供的博客资源,结合本文的讲解...

    hibernate框架一对一测试案例

    **hibernate框架一对一关联测试案例详解** 在Java开发中,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者能够用Java对象来处理数据。本篇我们将深入探讨Hibernate中的一对一...

    Hibernate 一对一关联映射(主键关联VS唯一外键关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的关系数据库模型。这篇文章将深入探讨两种主要的一对一关联映射方式:主键关联(Primary Key Join)和唯一外键关联(Foreign Key Join)。我们...

    Hibernate ORM - 一对一连接表关联关系

    标题"Hibernate ORM - 一对一连接表关联关系" 提示我们,这里主要讨论的是Hibernate ORM框架在处理数据库中一对一(One-to-One)关联映射的方法。Hibernate是一个流行的Java对象关系映射(ORM)工具,它允许开发者用...

    hibernate外键实现一对一单向关联关系源码

    在本主题中,我们将深入探讨如何利用Hibernate实现一对一(One-to-One)单向关联关系,并通过源码分析来理解其工作原理。 **一对一关联关系**在数据库设计中表示两个表之间存在唯一的对应关系,例如,一个人可能...

    hibernate一对一实例

    在这个“hibernate一对一实例”中,我们将深入探讨如何在Hibernate中实现一对一的映射,并通过具体的代码示例来帮助理解。 一、一对一关联的概念 一对一关联意味着一个实体只与另一个实体的一个实例相关联,反之...

    Hibernate 一对一外键单向关联

    在Hibernate中,一对一(One-to-One)映射是一种常见的关联关系,它表示两个实体之间存在一对一的对应关系。本篇文章将深入探讨Hibernate中的一对一外键单向关联。 首先,一对一外键关联指的是一个实体通过外键直接...

    Hibernate一对一关联映射(注解)

    ### Hibernate一对一关联映射原理 一对一关联映射是指在数据库中两个表之间存在一对一的关系,例如,一个人只有一个身份证,一个身份证也只属于一个人。在Hibernate中,我们可以通过@OneToOne注解来实现这种映射。 ...

    hibernate主键实现一对一单向关联关系源码

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联关系是常见的一种实体关系映射。本主题将深入探讨如何使用Hibernate通过主键来实现一对一的单向关联关系,并提供相关的源码分析。 首先,我们需要理解一对...

    hibernate一对一之唯一外键关联(单向关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联是对象关系映射(ORM)中的一个重要概念,用于表示两个实体之间一对一的关系。在这个场景下,我们将讨论一种特殊的一对一关联方式——唯一外键关联(Single...

    hibernate多对多关联映射

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...

Global site tag (gtag.js) - Google Analytics