`

Hibernate:一对一(1)

阅读更多
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());


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()也是做外连接!!!!!!!!但是如果只是查询从从表的对象那只是一个简单的查询!!!!!!!! 

  


  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics