Hibernate中一对一关联两种处理方式之一:参照表主键参照被参照表主键
POJO对象
被参照对象
参照对象
映射文件:
测试代码:
注意:不管是否利用关联访问被参照对象,还是参照对象的信息,都会两个表联合查询,输出的sql语句如下:
既是先访问那个对象也一样:
[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()也是做外连接!!!!!!!!但是如果只是查询从从表的对象那只是一个简单的查询!!!!!!!!
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()也是做外连接!!!!!!!!但是如果只是查询从从表的对象那只是一个简单的查询!!!!!!!!