`
ganshisheng
  • 浏览: 42536 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Hibernate 一对一外键单向关联

阅读更多
Hibernate 一对一外键单向关联


  基于外键关联的单向一对一关联和单向多对一关联几乎是一样的。唯一的不同就是单向一对一关联中的外键字段具有唯一性约束。只需要将原来的many-to-one元素增加unique="true"属性,用于表示N的一端也必须是唯一的,在N的一端增加了唯一的约束,即成为单向1-1。


一、模型介绍

一个人(Person)对应一个地址(Address)。

二、表模型
以下是基于MySQL表的创建的SQL脚本
address表:
CREATE TABLE `address` (
  `addressid` int(11) NOT NULL auto_increment,
  `address` varchar(255) default NULL,
  PRIMARY KEY  (`addressid`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;


person表:
CREATE TABLE `person` (
  `personid` int(11) NOT NULL auto_increment,
  `name` varchar(255) default NULL,
  `addressId` int(11) default NULL,
  PRIMARY KEY  (`personid`),
  CONSTRAINT FOREIGN KEY (`addressId`) REFERENCES `address` (`addressid`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;


三、实体
创建持久化类:(省略getter、setter方法)
package com.hibernate.oneone; 
public class Person {
	private int personid;
	private String name;
	private Address address;
}
 
public class Address {
	private int addressid;
	private String address;
}


下一步,我们把这个持久化类的信息告诉Hibernate。

四、映射文件:(省略dtd声明)
Address.hbm.xml
<hibernate-mapping>
    <class name="com.hibernate.oneone.Address" table="ADDRESS">
        <id name="addressid">
            <generator class="identity"/>
        </id>
        <property name="address"/>
    </class>
</hibernate-mapping>


Person.hbm.xml
<hibernate-mapping>
    <class name="com.hibernate.oneone.Person" table="PERSON">
        <id name="personid">
            <generator class="identity"/>
        </id>
        <property name="name"/>
        <!--用来映射关联PO column是Address在该表中的外键列名,增加unique变成“1-1”-->
        <many-to-one name="address" column="addressId" unique="true"/>
    </class>
</hibernate-mapping>


然后进行Hibernate的主要配置。

五、Hibernate配置
根据映射文件,进行hibernate配置,在hibernate.cfg.xml里添加如下代码,具体的JDBC配置有在Hibernate创建第一个应用程序中具体描述过。
<mapping resource="com/hibernate/oneone/Address.hbm.xml"/>
<mapping resource="com/hibernate/oneone/Person.hbm.xml"/>


六、启动和辅助类
加载和储存一些对象,首先启动Hibernate,此过程包括创建一个全局的SessoinFactory,并把它储存在应用程序代码容易访问的地方。SessionFactory可以创建并打开新的Session。一个Session代表一个单线程的单元操作,SessionFactory则是个线程安全的全局对象,只需要被实例化一次。

我们将创建一个HibernateUtil辅助类(helper class)来负责启动Hibernate和更方便地操作SessionFactory。让我们来看一下它的实现:
public class HibernateUtil {
	private static final SessionFactory sessionFactory;

    static {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            sessionFactory = new Configuration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}


七、测试方法
我们可以使用Hibernate来加载和存储对象了,编写一个带有main()方法的Test_Person_Address类:
public class Test_Person_Address {
	public static void main(String[] args) {
		Person person = new Person();
		person.setName("测试者");

		Address address = new Address();
		address.setAddress("杭州市延安路");

		person.setAddress(address);

		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		Transaction tx = session.beginTransaction();
		session.save(person);
		session.save(address);
		tx.commit();
		HibernateUtil.getSessionFactory().close();
	}
}


八、测试结果
1.session.save(address);
  session.save(person);

  Hibernate: insert into ADDRESS (address) values (?)
  Hibernate: insert into PERSON (name, addressId) values (?, ?)

2.session.save(person);
  session.save(address);

  Hibernate: insert into PERSON (name, addressId) values (?, ?)
  Hibernate: insert into ADDRESS (address) values (?)
  Hibernate: update PERSON set name=?, addressId=? where personid=?

3.session.save(address);
  //session.save(person);

  Hibernate: insert into ADDRESS (address) values (?)

4.//session.save(address);
  session.save(person);

  Hibernate: insert into PERSON (name, addressId) values (?, ?)
  Exception in thread "main" org.hibernate.TransientObjectException: com.hibernate.oneone.Address
分享到:
评论

相关推荐

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

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的...以上就是关于Hibernate一对一唯一外键关联映射(单向关联)的详细说明。通过这种方式,我们可以轻松地在Java应用中处理数据库的一对一关系。

    Hibernate 一对多外键单向关联

    在Java持久化框架Hibernate中,一对多外键单向关联是一种常见的关系映射方式,它描述了一对多的关系,其中一个实体(例如Person)可以与多个其他实体(例如Address)相关联,而关联的方向只从多方(Address)指向...

    Hibernate一对一单向外键关联 (联合主键annotation)

    本篇将详细讲解如何使用Hibernate进行一对一单向外键关联,并且该关联涉及到联合主键的注解配置。 首先,一对一关联可以分为两种类型:单向和双向。在单向一对一关联中,只有一个实体知道另一个实体的存在,而另一...

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

    在本案例中,我们将详细探讨“hibernate一对一唯一外键关联映射(单项关联)”。 首先,一对一关联分为两种类型:单向关联和双向关联。单向关联意味着在一个实体类中存在对另一实体的引用,而另一实体类中没有相应...

    Hibernate一对一单向外键关联(annotation/xml)

    本篇将深入探讨Hibernate中的一对一单向外键关联,通过注解和XML配置两种方式进行实现。这种关联允许一个实体类与另一个实体类之间存在一对一的关系,并且只在其中一个实体类中维护这种关系。 首先,我们来理解一对...

    hibernate one-to-one 一对一唯一外键关联映射_单向 and 双向

    在本文中,我们将详细介绍Hibernate一对一唯一外键关联映射的概念、配置方法和实践应用。 一对一唯一外键关联映射的概念 在Hibernate中,一对一唯一外键关联映射是指两个实体之间的关联关系,其中一个实体作为外键...

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

    本篇主要探讨的是Hibernate中的一对一(OneToOne)关系映射,特别是唯一外键关联(UniDirectional and Bidirectional Association)的情况。我们将深入理解这种关联方式的配置、实现以及它在实际应用中的价值。 1. ...

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

    总的来说,Hibernate的一对一唯一外键关联(单向关联)是通过在一方实体中定义另一方实体的引用,并通过注解或XML映射文件进行配置来实现的。这种关联方式简化了对象关系的管理,但同时也需要开发者在操作关联对象时...

    Hibernate关联映射

    1. Hibernate 一对一外键单向关联: 在 Hibernate 中,一对一的外键单向关联意味着一个实体类中的属性指向另一个实体类,而另一个实体类并不知道这个关联。这种关联可以通过在 `many-to-one` 元素中添加 `unique=...

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

    以上就是关于Hibernate外键实现一对一单向关联关系的详细说明。这个知识点涉及到数据库设计、ORM框架的使用,以及Java编程实践,对于理解和使用Hibernate进行数据库操作具有重要意义。在实践中,应结合具体业务场景...

    Hibernate教程04_关系映射之一对一单向外键关联

    **标题详解:**“Hibernate教程04_关系映射之一对一单向外键关联” 在Hibernate框架中,关系映射是数据库表之间的关联在对象模型中的体现。本教程重点讲解了一对一(One-to-One)单向外键关联的实现方法。在数据库...

    Hibernate关联映射-one to one单向外键关联

    本话题主要探讨的是Hibernate中的一种关联映射方式——一对一(One-to-One)单向外键关联。这种关联模式通常用于两个实体之间存在唯一对应的关系,例如一个用户对应一个唯一的账户。 在Hibernate中,一对一关联可以...

    Hibernate Annotation 基于外键的单向多对一关联

    本篇文章将深入探讨如何使用Hibernate Annotation来实现基于外键的单向多对一关联。 在关系型数据库中,多对一关联是一种常见的关系类型,意味着一个实体(如表)可以与另一个实体有多条记录关联,而另一个实体只能...

    Hibernate基于外键的一对多单向关联

    “Hibernate基于外键的一对多单向关联”这个标题指的是在Java持久化框架Hibernate中,如何通过外键实现一个实体类(如订单)与另一个实体类(如商品)之间的一对多关系,并且这种关联是单向的,即从订单端可以访问到...

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

    本主题将深入探讨如何使用Hibernate通过主键来实现一对一的单向关联关系,并提供相关的源码分析。 首先,我们需要理解一对一关联关系的基本概念。在数据库中,一对一关系意味着两个表中的每一条记录都对应另一表中...

    hibernate中的关联关系

    #### 三、Hibernate一对一外键单向关联 一对一外键单向关联是指两个表之间通过外键字段来进行关联,这种关联同样是单向的。 - **表模型设计** - 在 **Person** 表中包含一个额外的字段作为 `addressid` 的外键。 ...

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

    以上就是关于Hibernate中实现多对一单向关联关系的基本知识,包括如何在实体类中定义关联、如何进行数据库操作以及如何查询关联对象。这个源代码示例应该提供了更具体的实现细节,你可以通过查看和运行它来深入理解...

    hibernate一对一关联关系

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

Global site tag (gtag.js) - Google Analytics