对于hibernate的OneToOne我在实际的项目中并没有真正的使用过,这里只是做一些简单的了解,假设有如下两个数据库表:
IDCARDS[id varchar2(64) not null,
card_no varchar2(100) not null,
person_id varchar2(64) not null
]
person[id varchar2(64) not null,varchar2(100) name]
IDCARDS[id varchar2(64) not null,
card_no varchar2(100) not null,
person_id varchar2(64) not null
]
person[id varchar2(64) not null,varchar2(100) name]
当前可以确定的操作有:
读数据:
读取person,
读取idcard,
写数据:
写person信息到数据库中
写idcard信息到数据库
更新数据:
更新person数据
更新idcard信息数据
删除数据:
删除person数据信息
删除idcard数据信息
统计数据:
统计person的总数
按照上面的需求,设计类文件如下,这里我们选择使用OneToOne:
写数据的测试:
读数据:
读取person,
读取idcard,
写数据:
写person信息到数据库中
写idcard信息到数据库
更新数据:
更新person数据
更新idcard信息数据
删除数据:
删除person数据信息
删除idcard数据信息
统计数据:
统计person的总数
按照上面的需求,设计类文件如下,这里我们选择使用OneToOne:
- @Entity
- @Table(name="IDCARDS")
- public class IDCard implements Serializable {
- private static final long serialVersionUID = 1L;
- private String id;
- private String cardNo;
- private Person person;
- /**
- * @return Returns the person.
- */
- @OneToOne(optional=true,cascade=CascadeType.ALL,fetch=FetchType.LAZY)
- @JoinColumn(name="person_id")
- public Person getPerson() {
- return person;
- }
- ......
- }
- @Entity
- @Table(name="persons")
- public class Person implements Serializable {
- private static final long serialVersionUID = 1L;
- private String id;
- private String name;
- private IDCard idCard;
- /**
- * @return Returns the idCard.
- */
- @OneToOne(optional=true,cascade=CascadeType.ALL,mappedBy="person",fetch=FetchType.LAZY)
- public IDCard getIdCard() {
- return idCard;
- }
- .......
- }
- public static void testOneToOne3(){
- Person person = new Person();
- person.setId("0001");
- person.setName("snowflower");
- IDCard card = new IDCard();
- card.setId("123456");
- card.setCardNo("123456789012");
- card.setPerson(person);
- Transaction tx = session.beginTransaction();
- tx.begin();
- session.save(person);
- session.save(card);
- session.flush();
- tx.commit();
- }
这种情况下执行的语句为:
更新数据:
- public static void testOneToOne4(){
- IDCard card = (IDCard)session.load(IDCard.class,"123456");
- if(card != null){
- card.setCardNo("new"+card.getCardNo());
- }
- Transaction tx = session.beginTransaction();
- tx.begin();
- session.update(card);
- session.flush();
- tx.commit();
- }
在这里尝试更新IDCard的数据信息时hibernate产生的sql语句为:
Hibernate: select idcard0_.id as id2_1_,
idcard0_.card_no as card2_2_1_,
idcard0_.person_id as person3_2_1_,
person1_.id as id1_0_,
person1_.name as name1_0_
from
IDCARDS idcard0_
left outer join
persons person1_
on
idcard0_.person_id=person1_.id where idcard0_.id=?
Hibernate: select idcard0_.id as id2_1_,
idcard0_.card_no as card2_2_1_,
idcard0_.person_id as person3_2_1_,
person1_.id as id1_0_,
person1_.name as name1_0_
from
IDCARDS idcard0_
left outer join
persons person1_
on
idcard0_.person_id=person1_.id where idcard0_.person_id=?
Hibernate: update IDCARDS set card_no=?, person_id=? where id=?
感觉更新了一个IDCard的编号却牵连到如此语句,从某中意义上说,一条update语句足够了…………
为了改变更新的效率尝试如下的做法:
- public static void testOneToOne4(){
- Person person = (Person)session.load(Person.class,"0001");
- IDCard card = person.getIdCard();
- Transaction tx = session.beginTransaction();
- tx.begin();
- card.setCardNo("new"+card.getCardNo());
- session.update(card);
- session.flush();
- tx.commit();
- }
Hibernate: select person0_.id as id1_1_,
person0_.name as name1_1_,
idcard1_.id as id2_0_,
idcard1_.card_no as card2_2_0_,
idcard1_.person_id as person3_2_0_
from
persons person0_
left outer join
IDCARDS idcard1_
on
person0_.id=idcard1_.person_id where person0_.id=?
Hibernate: update IDCARDS set card_no=?, person_id=? where id=?
这里需要注意的一点就是,如果IDCard数据没有改变的话是不会产生update语句的