hibernate inverse

inverse的意思是:相反、倒转;相反的、倒转的。 在hibernate xml映射配置文件里面表示由那一方维护表关系。inverse="true"表示由对方维护表关系,inverse="false"则反之。示例以下:java

Member与MemberCard是一对多的关系:mysql

1. 关系由MemberCard维护。git

Member配置。Member.hbm.xmlsql

<set name="memberCards" inverse="true" cascade="save-update" lazy="true"
  table="member_card">
    <key>
        <column name="member_id" not-null="true" />
    </key>  
    <one-to-many class="com.wss.lsl.hibernate.mysql.demo.xml.core.entity.MemberCard" /></set>

MemberCard配置。MemberCard.hbm.xmlsession

<many-to-one name="member" column="member_id" not-null="true"
            class="com.wss.lsl.hibernate.mysql.demo.xml.core.entity.Member" />

执行以下java代码app

Member member = new Member();
member.setMemberName("张三");
Set<MemberCard> memberCards = new HashSet<MemberCard>();
MemberCard card1 = new MemberCard();
card1.setCardNo("1234567890");
MemberCard card2 = new MemberCard();
card2.setCardNo("1234567891");
MemberCard card3 = new MemberCard();
card3.setCardNo("1234567892");

// 由MemberCard维护关系,必须设置Member,否则插入外键时找不到member_id
card1.setMember(member);
card2.setMember(member);
card3.setMember(member);
memberCards.add(card1);
memberCards.add(card2);
memberCards.add(card3);
member.setMemberCards(memberCards);
session.save(member);

获得的sql输出以下:MemberCard在插入时,把外键也插入了。ui

Hibernate: insert into member (id, member_name) values (null, ?)
Hibernate: insert into member_card (id, card_no, member_id) values (null, ?, ?)
Hibernate: insert into member_card (id, card_no, member_id) values (null, ?, ?)
Hibernate: insert into member_card (id, card_no, member_id) values (null, ?, ?)
  • 2. 关系由Member维护。.net

xml映射文件的配置大体相同,只是Member中的配置inverse="false", MemberCard中的<many-to-one not-null="true" .. /> not-null要设置成false。 先插入MemberCard,外键暂时为null,后期再由Member update设置MemberCard的外键,因此not-null要容许为null,否则执行不经过。 保存的java代码和上面稍有不一样,MemberCard不须要设置Member了。hibernate

Member member = new Member();
member.setMemberName("张三");
Set<MemberCard> memberCards = new HashSet<MemberCard>();
MemberCard card1 = new MemberCard();
card1.setCardNo("1234567890");
MemberCard card2 = new MemberCard();
card2.setCardNo("1234567891");
MemberCard card3 = new MemberCard();
card3.setCardNo("1234567892");

memberCards.add(card1);
memberCards.add(card2);
memberCards.add(card3);
member.setMemberCards(memberCards);
session.save(member);

获得的sql输出以下:多了几条update语句。code

Hibernate: insert into member (id, member_name) values (null, ?)
Hibernate: insert into member_card (id, card_no, member_id) values (null, ?, ?)
Hibernate: insert into member_card (id, card_no, member_id) values (null, ?, ?)
Hibernate: insert into member_card (id, card_no, member_id) values (null, ?, ?)
Hibernate: update member_card set member_id=? where id=?
Hibernate: update member_card set member_id=? where id=?
Hibernate: update member_card set member_id=? where id=?

从一对多的关系维护中,不难看出由“多端”维护关系,效率要高。

更多参考hibernate demo

相关文章
相关标签/搜索