Hibernate关系映射(二) 基于外键的双向一对一

基于外键的双向一对一关联映射

需要在一端添加<one-to-one>标签,用property-ref来指定反向属性引用。

还是通过刚才用户和地址来演示双向一对一关联。

代码演示

一、实体类

Account.cs,需要添加被控端的引用

package com.lxit.entity;

import java.io.Serializable;

public class Account implements Serializable{
    public Account(){

    }
    private int id;
    private String name;
    private String password;
    //需要添加被控端的引用
    private Address address;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }

}

 

Address.cs,被控端也需要添加主控端的引用

package com.lxit.entity;

import java.io.Serializable;

public class Address implements Serializable{
    public Address(){

    }
    private int id;
    private String name;

    //双向1对1,被控端也知道主控端的引用
    private Account account;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Account getAccount() {
        return account;
    }
    public void setAccount(Account account) {
        this.account = account;
    }
}

 

二、映射文件

Account.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="com.lxit.entity.Account" table="Account">
  <id column="id" name="id">
   <generator class="native"/>
  </id>
  <property column="name" generated="never" lazy="false" name="name"/>
  <property column="password" generated="never" lazy="false" name="password"/>
  <!-- 通过many-to-one 标签添加唯一属性约束,建立一对一关联关系 -->
  <many-to-one column="address_id" name="address" unique="true"/>
  <!-- 必须通过映射关系生成的表才会生成唯一约束,否则不会生成 -->
 </class>
</hibernate-mapping>

 

Address.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="com.lxit.entity.Address" table="Address">
  <id column="id" name="id">
   <generator class="native"/>
  </id>
  <property column="name" generated="never" lazy="false" name="name"/>

  <!-- one-to-one 映射一对一关联,name对应当前类的引用属性,property-ref属性:指定account类的属性引用 -->
  <one-to-one name="account" property-ref="address"></one-to-one>
 </class>
</hibernate-mapping>

 

jUtilTest

package com.lxit.demo2.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.Test;

import com.lxit.entity.Account;
import com.lxit.entity.Address;
import com.lxit.util.HibernateUtil;

public class AccountTest {

    @Test
    public void createTable(){
        Configuration cfg = new Configuration().configure();
        SchemaExport se = new SchemaExport(cfg);
        se.create(true, true);
    }

    @Test
    public void Add(){
        Transaction tx = null;
        Session session = HibernateUtil.getSession();
        tx = session.beginTransaction();

        Address address= new Address();
        address.setName("深圳宝安");
        session.save(address);

        Account account = new Account();
        account.setName("zhangsan");
        account.setPassword("123");
        account.setAddress(address);

        try {
            session.save(account);
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        }finally{
            HibernateUtil.CloseSession(session);
        }

    }

    @Test
    public void Add2(){
        Transaction tx = null;
        Session session = HibernateUtil.getSession();
        tx = session.beginTransaction();

        Address address= new Address();
        address.setName("深圳福田");
        session.save(address);

        Account account1 = new Account();
        account1.setName("lisi");
        account1.setPassword("123");
        account1.setAddress(address);

        Account account2 = new Account();
        account2.setName("wangwu");
        account2.setPassword("123");
        account2.setAddress(address);

        try {
            //重复添加第二个用户,地址相同,则会报错
            session.save(account1);
            session.save(account2);
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        }finally{
            HibernateUtil.CloseSession(session);
        }

    }
}
时间: 2024-11-06 15:18:49

Hibernate关系映射(二) 基于外键的双向一对一的相关文章

hibernate 之 关联映射的基于外键的双向一对一关联

1. 人和身份证是一个一对一的关系,他们的表结构为: 2. 类结构:Person.java public class Person { private int id; private String name; private int age; private IdCard idCard; public Person() { } public Person(String name, int age) { super(); this.name = name; this.age = age; } pu

java之hibernate之基于外键的双向一对一关联映射

这篇讲解 基于外键的双向一对一关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 2.类结构 Person.java public class Person implements Serializable{ private int id; private String name; private IdCard idCard; public Person() { } public Person(String name) { super(); this.name = name;

hibernate 之 关联映射的基于外键的单向一对一映射

1. 人和身份证是一个一对一的关系,他们的表结构为: 2. 类结构:IdCard.java : public class IdCard { private String id; private String address; public IdCard() { } public IdCard(String id, String address) { super(); this.id = id; this.address = address; } public String getId() { r

Hibernate关系映射(一) 基于外键的单向一对一

模拟用户和地址的映射关系,一个用户只有一个地址,用户知道地址,但是地址不知道用户.用户对地址的单向一对一映射. 一.建立实体类 Account.cs类 package com.lxit.entity; import java.io.Serializable; public class Account implements Serializable{ public Account(){ } private int id; private String name; private String pa

浅谈Hibernate关系映射(2)

继上篇博客 一对一关系映射:一对一关联映射在实际生活中是比较常见的,如人与身份证的关系,通过人这个对象可以找到他相关的内容. 一对一单向(主键): 单向一对一主键关联,靠的是它们的主键相等,从Person中能看到IdCard,也就是把t_idCard中的主键拿过来当做t_Pseron的主键. 如图的线表示一个关联,在person中可以看见idcard.即在person中持有idCard的引用 person类的映射关系 <hibernate-mapping> <class name=&qu

hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同

基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同,主要区别是在配置映射文件上会有区别 两个持久化类为Manager和Department 1:基于主键映射1-1关联关系 1)使用其他持久化类的主键生成主键的实体的映射文件 首先需要指定主键生成方式为foreigner 格式为: <id name="departmentId" type="java.lang.Integer"> <column name="department_i

Hibernate(八):基于外键映射的1-1关联关系

背景: 一个部门只有一个一把手,这在程序开发中就会设计数据映射应该设置为一对一关联. 在hibernate代码开发中,实现这个业务有两种方案: 1)基于外键映射的1-1关联: 2)基于主键映射的1-1关联. 本篇文章主要是用来学习如何使用外键实现1-1关联关系. 新建项目hibernate05 新建java project,引入依赖包,在src下添加hibernate.cfg.xml 1 <?xml version="1.0" encoding="UTF-8"

Entity Framework - 基于外键关联的单向一对一关系

代码的世界,原以为世界关系很简单,确道是关系无处不在.NET世界里ORM框架中EntityFramework作为其中翘楚,大大解放了搬砖工作的重复工作,着实提高了不少生产力,而也碰到过不少问题!比如关系的映射! 一对一关系的映射: 用户账户密码信息表:包含用户名 密码 邮箱等账户登录时的信息 public class SystemAccount { public SystemAccount() { Id = DateUtils.GeneratedNewGuid(); } public Guid

注解:【基于外键的】Hibernate单向1-&gt;1关联

Person与Address关联:单向1->1,[基于外键的] Person.java package org.crazyit.app.domain; import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Generati