只是Facebook和MyFriends
Facebook Notice添加便捷方法和MutableLong(后来,我告诉你为什么使用MutableLong)
public class Facebook { private MutableLong id = new MutableLong(); public Long getId() { return id.longValue(); } public void setId(Long id) { this.id.setValue(id); } public MutableLong getIdAsMutableLong() { return id; } private Collection<MyFriends> myFriends = new ArrayList<MyFriends>(); public Collection<MyFriends> getMyFriends() { return myFriends; } public void setMyFriends(Collection<MyFriends> myFriends) { this.myFriends = myFriends; } public void addFriend(Facebook myFriendFacebook) { myFriends.add(new MyFriends(this, myFriendFacebook)); }}MyFriends
public class MyFriends { private MyFriendsId myFriendId; public MyFriendsId getmyFriendId(){ return this.myFriendId; } public void setmyFriendId(MyFriendsId myFriendId){ this.myFriendId = myFriendId; } private Facebook me; public Facebook getme() { return this.me; } public void setme(Facebook me){ this.me = me; } private Facebook myFriend; public Facebook getmyFriend() { return this.myFriend; } public void setmyFriend(Facebook friend) { this.myFriend = friend; } public MyFriends() {} public MyFriends(Facebook meFacebook, Facebook myFriendFacebook){ this.me = meFacebook ; this.myFriend = myFriendFacebook; this.myFriendId = new MyFriendsId(meFacebook.getIdAsMutableLong(), myFriendFacebook.getIdAsMutableLong()); } public static class MyFriendsId implements Serializable { private MutableLong meId = new MutableLong(); public Long getMeId() { return this.meId.longValue(); } public void setMeId(Long id) { this.meId.setValue(id); } private MutableLong myFriendId = new MutableLong(); public Long getMyFriendId(){ return this.myFriendId.longValue(); } public void setMyFriendId(Long id) { this.myFriendId.setValue(id); } public MyFriendsId() {} public MyFriendsId(MutableLong meId, MutableLong myFriendId) { this.meId = meId; this.myFriendId = myFriendId; } @Override public boolean equals(Object o) { if (!(o instanceof MyFriendsId)) return false; MyFriendsId other = (MyFriendsId) o; return new EqualsBuilder() .append(getMeId(), other.getMeId()) .append(getMyFriendId(), getMyFriendId()) .isEquals(); } @Override public int hashCode() { return new HashCodeBuilder() .append(getMeId()) .append(getMyFriendId()) .hashCode(); } }}映射
<hibernate-mapping package="br.com._3845772.model.domain"> <class name="User"> <id name="id"> <generator /> </id> <many-to-one cascade="all" name="facebook"/> </class> <class name="Facebook"> <id name="id"> <generator /> </id> <bag cascade="all" name="myFriends"> <key column="ME_FACEBOOK_ID" update="false"/> <one-to-many /> </bag> </class> <class name="MyFriends"> <composite-id name="myFriendId"> <key-property column="ME_FACEBOOK_ID" name="meId"/> <key-property column="MY_FRIEND_FACEBOOK_ID" name="myFriendId"/> </composite-id> <many-to-one column="ME_FACEBOOK_ID" insert="false" name="me" update="false"/> <many-to-one column="MY_FRIEND_FACEBOOK_ID" insert="false" name="myFriend" update="false"/> </class></hibernate-mapping>
还有这个样本
Facebook meFacebook = new Facebook();Facebook myFriendFacebook = new Facebook();meFacebook.addFriend(myFriendFacebook);Session session = sessionFactory.openSession();session.beginTransaction();session.save(myFriendFacebook);session.save(meFacebook);session.getTransaction().commit();session.close();
这给了我
Hibernate: insert into Facebook values ( )Hibernate: insert into Facebook values ( )Hibernate: select myfriends_.ME_FACEBOOK_ID, myfriends_.MY_FRIEND_FACEBOOK_ID from MyFriends myfriends_ where myfriends_.ME_FACEBOOK_ID=? and myfriends_.MY_FRIEND_FACEBOOK_ID=?Hibernate: insert into MyFriends (ME_FACEBOOK_ID, MY_FRIEND_FACEBOOK_ID) values (?, ?)
几个注意事项
- Hibernate 不支持 自动生成复合主键。 您必须先 设置其值,然后再保存
- 您的数据库 必须支持目标生成器策略 (如果您不知道数据库支持哪种生成器策略,请使用 本机 策略)
- 每个实体 必须提供一个无参数的构造函数
现在为什么用MutableLong(用Long属性 封装 )而不是Long呢?
Number及其子类(Long为Number)是不可变的。因此,如果要让Facebook.id(由数据库配置)与其对应的MyFriend $MyFriendId.meId共享相同的值,则必须使用MutableLong。当数据库设置Facebook.id时,MyFriend $MyFriendId.meId将自动获得其最新值。但是,如果您使用MutableLong,就会发生这种情况。



