Hibernate:一对一(1)

本文介绍Hibernate框架中实现一对一关联关系的方法,通过使用主键关联的方式,展示了Person与IdCart两个实体类之间的映射关系,并提供了相应的测试代码。

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

Hibernate中一对一关联两种处理方式之一:参照表主键参照被参照表主键


POJO对象

被参照对象
public class Person {

private Integer id;
private String name;
private IdCart idCart;


public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public IdCart getIdCart() {
return idCart;
}
public void setIdCart(IdCart cart) {
idCart = cart;
}
}



参照对象
public class IdCart {

private Integer id;
private String userFullTime;
private Person person;

public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserFullTime() {
return userFullTime;
}
public void setUserFullTime(String userFullTime) {
this.userFullTime = userFullTime;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}


映射文件:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.itcast.hibernate.domain">

<class name="Person">
<id name="id">
<generator class="native" />
</id>
<property name="name"/>
<one-to-one name="idCart"/>
</class>
</hibernate-mapping>



<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.itcast.hibernate.domain">

<class name="IdCart" table="cart">
<id name="id" unsaved-value="-1">
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
<property name="userFullTime"/>
<one-to-one name="person" constrained="true"/>
</class>
</hibernate-mapping>



测试代码:

public class OneToOneTest {

public static void main(String[] args) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();

Person person = new Person();
person.setName("张三");

IdCart iCart = new IdCart();
iCart.setUserFullTime("29年");

iCart.setPerson(person);
person.setIdCart(iCart);

session.save(person);
session.save(iCart);

Person person1 = (Person)session.get(Person.class, 1);
System.out.println(person1.getName());

//IdCart idCart = person1.getIdCart();
//System.out.println(idCart.getUserFullTime());


tx.commit();
}

}


注意:不管是否利用关联访问被参照对象,还是参照对象的信息,都会两个表联合查询,输出的sql语句如下:


既是先访问那个对象也一样:
		IdCart idCart = (IdCart)session.get(IdCart.class, 2);
System.out.println(idCart.getUserFullTime());

Person person2 = idCart.getPerson();
System.out.println(person2.getName());


[code="java"]Hibernate:
select
person0_.id as id2_1_,
person0_.name as name2_1_,
idcart1_.id as id3_0_,
idcart1_.userFullTime as userFull2_3_0_
from
Person person0_
left outer join
cart idcart1_
on person0_.id=idcart1_.id
where
person0_.id=?code]


只是一条查询语句,左外连接{一对一和多对一及一对多查询不同!!!}既是没有输出及没有调用p.getIdCard()也是做外连接!!!!!!!!但是如果只是查询从从表的对象那只是一个简单的查询!!!!!!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值