当前位置:首页 > Hibernate

Hibernate 一对一主键单向关联

canca18年前 (2008-08-21)Hibernate503

1-1的关联可以基于主键关联,但基于主键关联的持久化类不能拥有自己的主键生成策略,它的主键由关联类负责生成.另外,另外,增加one-to-one元素来关联属性,必须为one-to-one元素增加constrained="true"属性,表明该类主键由关联类生成.
   
一.模型介绍

一个人对应一个地址.

二.实体(省略getter、setter方法)

public class Person11pk {
    private int personid;
    private String name;
    private int age;
    private Address11pk address11pk;

public class Address11pk {
    private int addressid;
    private String addressdetail;

三 .生成的SQL脚本

/* Formatted on 2007/08/22 14:40 (QP5 v5.50) */
CREATE TABLE `address_11pk` (
`addressid` int(11) NOT NULL auto_increment,
`addressdetail` varchar(255) default NULL,
PRIMARY KEY (`addressid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=gbk;


/* Formatted on 2007/08/22 14:41 (QP5 v5.50) */
CREATE TABLE `person_11pk` (
`presonid` int(11) NOT NULL,
`name` varchar(255) default NULL,
`age` int(11) default NULL,
PRIMARY KEY (`presonid`),
KEY `FK68A882C591BB393E` (`presonid`),
CONSTRAINT `FK68A882C591BB393E` FOREIGN KEY (`presonid`) REFERENCES `address_11pk` (`addressid`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;


四.映射方法:在Person中配置id生成策略为:

        <id name="personid">
            <!--基于主键关联时,主键生成策略是foreign,表明根据关联类生成主键-->
            <generator class="foreign">
                <!--关联持久化类的属性名-->
                <param name="property">address11pk</param>
            </generator>
        </id>
        ......
        <!--用于映射1-1关联-->
        <one-to-one name="address11pk" constrained="true"/>

<hibernate-mapping>
    <class name="com.lavasoft.dx._1_1_pk.Person11pk" table="PERSON_11pk">
        <id name="personid" column="presonid">
            <!--基于主键关联时,主键生成策略是foreign,表明根据关联类生成主键-->
            <generator class="foreign">
                <!--关联持久化类的属性名-->
                <param name="property">address11pk</param>
            </generator>
        </id>
        <property name="name"/>
        <property name="age"/>
        <!--用于映射1-1关联-->
        <one-to-one name="address11pk" constrained="true"/>
    </class>
</hibernate-mapping>

<hibernate-mapping>
    <class name="com.lavasoft.dx._1_1_pk.Address11pk" table="ADDRESS_11pk">
        <id name="addressid">
            <generator class="identity"/>
        </id>
        <property name="addressdetail"/>
    </class>
</hibernate-mapping>


五.测试

public class Test_11pk {
    public static void main(String[] args){
        Person11pk p1=new Person11pk();

        p1.setAge(21);
        p1.setName("p1");

        Address11pk add1=new Address11pk();
        add1.setAddressdetail("上海市牛顿路");

        p1.setAddress11pk(add1);

        Session session= HibernateUtil.getCurrentSession();
        Transaction tx=session.beginTransaction();
        session.save(add1);
        session.save(p1);
        tx.commit();
        HibernateUtil.closeSession();
    }
}


六.测试结果

1.正常保存. 推荐
        session.save(add1);
        session.save(p1);

Hibernate: insert into ADDRESS_11fk (addressdetail) values (?)
Hibernate: insert into PERSON_11fk (name, age, addressId) values (?, ?, ?)

2.正常保存.
        session.save(p1);
        session.save(add1);

Hibernate: insert into PERSON_11fk (name, age, addressId) values (?, ?, ?)
Hibernate: insert into ADDRESS_11fk (addressdetail) values (?)
Hibernate: update PERSON_11fk set name=?, age=?, addressId=? where personid=?

3.正常保存.
//        session.save(p1);
        session.save(add1);

Hibernate: insert into ADDRESS_11fk (addressdetail) values (?)

4. 发生异常,不能保存.
        session.save(p1);
//        session.save(add1);

Hibernate: insert into PERSON_11fk (name, age, addressId) values (?, ?, ?)
Exception in thread "main" org.hibernate.TransientObjectException: com.lavasoft.dx._1_1_fk.Address11fk

 

扫描二维码推送至手机访问。

版权声明:本文由Ant.Master's Blog发布,如需转载请注明出处。

本文链接:https://iant.work/post/373.html

标签: Hibernate
分享给朋友:

“Hibernate 一对一主键单向关联” 的相关文章

如何把Hibernate2.1升级到Hibernate3.0?

1.1 Hibernate API 变化 1.1.1 包名 1.1.2 org.hibernate.classic包 1.1.3 Hibernate所依赖的第三方软件包 1.1.4 异常模型 1.1.5 Session接口 1.1.6 createSQLQuery() 1.1.7 Lifecycle…

Hibernate读取Blob类型方法

java 有Blob Clob 类型 像是对其他类型一样写 POJOprivate Blob image; set get........<propery   name="i…

Hibernate + Proxool连接池

费话就不说啦! hibernate.cfg.xml 加入: <property name="hibernate.proxool.pool_alias">dbpool</property>  <property name="hibernate.prox…

关于VO、PO的理解

O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写。通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据。在O/R Mapping的世界里,有两个基本的也是重要的东东需要了解,即VO,PO。 VO,值对象(Value Object),...…

关于Hibernate3的NativeSQL查询是如此简单

转自:http://blog.donews.com/rory/archive/2006/07/22/973406.aspx 现在的系统中虽然使用了。Hibernate但是没有使用Hibernate的关联关系来进行数据库操作。所有的管理操作都是单独实现的。所以也不能用Criteria.add()这种方…

hibernate's hbm 文件配置

外键:<many-to-one> 被外键引用:<set>…

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。