Hibernate一对一关联关系

本文通过具体实例,详细介绍了在Hibernate框架中实现一对一关联的两种方式:主键关联与唯一外键关联。包括创建数据库表结构、配置映射文件、编写DAO操作类等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.主键关联

关系表

create table person(
p_id varchar(32) primary key,
p_name varchar(20)
);
create table card(
c_id varchar(32) primary key,
c_num varchar(30),
foreign key(c_id) references person(p_id)
);

 

xml文件

<class name="po.onetoone.Person" table="person" catalog="orm">
		<id name="PId" type="java.lang.String">
			<column name="p_id" length="32" />
			<generator class="uuid.hex" />
		</id>
		<property name="PName" type="java.lang.String">
			<column name="p_name" length="20" />
		</property>
		<one-to-one name="card" class="po.onetoone.Card" cascade="all"
			outer-join="false">
		</one-to-one>
	</class>


<class name="po.onetoone.Card" table="card" catalog="orm">
		<id name="CId" type="java.lang.String">
			<column name="c_id" length="32" />
			<generator class="foreign">
				<param name="property">person</param>
			</generator>
		</id>
		<property name="CNum" type="java.lang.String">
			<column name="c_num" length="30" />
		</property>
		<one-to-one name="person" class="po.onetoone.Person"
			constrained="true">
		</one-to-one>
	</class>

 

DAO文件

package dao;

import org.hibernate.Query;
import org.hibernate.Session;

import po.onetoone.Card;
import po.onetoone.Person;

import config.HibernateSessionFactory;

/**
 * 一对一关联-->主键关联
 * 
 * @author Simon
 * 
 */
public class CardDAO {
	public void insert(String pName, String cNum) {// 测试添加
		Session session = null;
		try {
			session = HibernateSessionFactory.getSession();
			Person person = new Person();
			Card card = new Card();
			person.setCard(card);
			person.setPName(pName);
			card.setPerson(person);
			card.setCNum(cNum);
			session.beginTransaction();
			session.save(person);
			session.beginTransaction().commit();
			session.close();

		} catch (Exception e) {
			// TODO: handle exception
			if (session != null) {
				session.close();
			}
		}

	}

	public void delete(String pName) {// 测试删除
		Session session = null;
		try {
			session = HibernateSessionFactory.getSession();
			Query query = session.createQuery("from Person where PName=?");
			query.setString(0, pName);
			if (query.list().size() != 0) {
				Person person = (Person) query.list().get(0);
				session.beginTransaction();
				session.delete(person);
				session.beginTransaction().commit();
				session.close();
			} else {
				System.out.println("Null");
			}
		} catch (Exception e) {
			// TODO: handle exception
			if (session != null) {
				session.close();
			}
		}

	}

	public void select(String pName) {// 测试查寻
		Session session = null;
		try {
			session = HibernateSessionFactory.getSession();
			session.beginTransaction();
			Query query = session.createQuery("from Person where PName=?");
			query.setString(0, pName);
			if (query.list().size() != 0) {
				Person person = (Person) query.list().get(0);
				System.out.println(person.getPName() + "的卡号为:"
						+ person.getCard().getCNum());

			} else {
				System.out.println("null");
			}
			session.beginTransaction().commit();
			session.close();
		} catch (Exception e) {
			// TODO: handle exception
			if (session != null) {
				session.close();
			}
		}

	}

	public void update(String pName, String reNum) {// 测试修改
		Session session = null;
		try {
			session = HibernateSessionFactory.getSession();
			session.beginTransaction();
			Query query = session.createQuery("from Person where PName=?");
			query.setString(0, pName);
			if (query.list().size() != 0) {
				Person person = (Person) query.list().get(0);
				Card card = person.getCard();
				card.setCNum(reNum);
				session.saveOrUpdate(person);
				System.out.println(pName + "的卡号修改为:" + reNum);
			} else {
				System.out.println("null");
			}
			session.beginTransaction().commit();
			session.close();
		} catch (Exception e) {
			// TODO: handle exception
			if (session != null) {
				session.close();
			}
		}

	}

	public static void main(String[] args) {
		// new CardDAO().insert("p2","c2");
		// new CardDAO().delete("p1");
		// new CardDAO().select("p2");
		new CardDAO().update("p2", "c22244");

	}

}

二.唯一外键关联

 

create table simon.person(
    p_id varchar2(32) primary key,
    p_name varchar2(20),
    p_address varchar2(40),
    p_date date
    )
    create table simon.card(
    c_id varchar2(32) primary key,
    c_balance number(6,2),
    c_date date,
    f_p_id varchar2(32) unique,
    foreign key(f_p_id) references simon.person(p_id)
    )

 配置文件

 <class name="onetoone.Card" table="CARD" schema="SIMON">
        <id name="CId" type="java.lang.String">
            <column name="C_ID" length="32" />
            <generator class="uuid.hex"></generator>
        </id>
        
        <property name="CBalance" type="java.lang.Double">
            <column name="C_BALANCE" precision="6" />
        </property>
        <property name="CDate" type="java.util.Date">
            <column name="C_DATE" length="7" />
        </property>
        <many-to-one name="person" class="onetoone.Person"  column="f_p_id" cascade="all" 
unique="true">
         </many-to-one>
    </class>
 <class name="onetoone.Person" table="PERSON" schema="SIMON">
        <id name="PId" type="java.lang.String">
            <column name="P_ID" length="32" />
            <generator class="uuid.hex"></generator>
        </id>
        <property name="PName" type="java.lang.String">
            <column name="P_NAME" length="20" />
        </property>
        <property name="PAddress" type="java.lang.String">
            <column name="P_ADDRESS" length="40" />
        </property>
        <property name="PDate" type="java.util.Date">
            <column name="P_DATE" length="7" />
        </property>
        <one-to-one name="card" class="onetoone.Card"  property-ref="person" cascade="all">
        
        </one-to-one>
    </class>
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值