嗨,我正在尝试在hibernate状态下映射一些类,但在如何完成此类映射方面存在一般性问题。有User类和Facebook用户类,它们具有以下结构User Class:
public class User{ public User(){} Long Id; String FirstName; String LastName; .... FbUser fbuser; //// all requred getters and setters... }
Facebook类FbUser可以具有属于同一类FbUser的对象的Friends列表。
public class FbUser{ public FbUser(){} Long fbId; String FirstName; String LastName; List<FbUser> friends; //// all requred getters and setters... }
到现在为止,我在User和FbUser之间建立了许多一对一的关系。
<hibernate-mapping> <class name="User" table="User" > <id name="Id" column="ID" type="java.lang.Long" unsaved-value="null" > <generator class="increment"/> </id> <property name="FirstName" update="true" insert="true" not-null="false" unique="false" type="java.lang.String" > <column name="FirstName" /> </property> <property name="LastName" update="true" insert="true" not-null="false" unique="false" type="java.lang.String" > <column name="LastName" /> </property> <many-to-one name="fbUser" class="FbUser" cascade="all" column="fbId" unique="true" /> </class> </hibernate-mapping>
现在,FbUser映射:
<hibernate-mapping> <class name="FbUser" table="FbUser" > <id name="fbId" column="fbId" type="java.lang.Long" unsaved-value="null" > <generator class="increment"/> </id> <property name="FirstName" update="true" insert="true" not-null="false" unique="false" type="java.lang.String" > <column name="FirstName" /> </property> <property name="LastName" type="java.lang.String" update="true" insert="true" column="LastName" not-null="true" unique="false" /> </class> </hibernate-mapping>
如何在FbUser Map文件中映射FbUser List?我迷路了 :(
您可以创建一个名为MyFriends的附加类。
public class FbUser { List<MyFriends> friends = new ArrayList<MyFriends>(); }
只是相关的部分
如果您有索引栏
<hibernate-mapping> <class name="FbUser"> <list name="myFriends"> <key column="ME_ID" insert="false" update="false"/> <list-index column="WHICH COLUMN SHOULD BE USED AS INDEX"/> <one-to-many class="MyFriends"/> </list> </class> </hibernate-mapping>
如果您没有索引列
将您的清单改写为
public class FbUser { Collection<MyFriends> friends = new ArrayList<MyFriends>(); }
和
<hibernate-mapping> <class name="FbUser"> <bag name="columns"> <key column="ME_ID" insert="false" update="false"/> <one-to-many class="MyFriends"/> </bag> </class> </hibernate-mapping>
以及您的MyFriends映射。 注意,您需要一个复合主键 (实现为静态内部类)
<class name="MyFriends"> <composite-id name="myFriendsId" class="MyFriends$MyFriendsId"> <key-property name="meId"/> <key-property name="myFriendId"/> </composite-id> <many-to-one name="me" class="FbUser" insert="false" update="false"/> <many-to-one name="myFriend" class="FbUser" insert="false" update="false"/> </class>
您的MyFriends如下所示
public class MyFriends { private MyFriendsId myFrinedId; private FbUser me; private FbUser myFriend; public static class MyFriendsId implements Serializable { private Integer meId; private Integer myFriendId; // getter's and setter's public MyFriendsId() {} public MyFriendsId(Integer meId, Integer myFriendId) { this.meId = meId; this.myFriendId = myFriendId; } // getter's and setter's public boolean equals(Object o) { if(!(o instanceof MyFriendsId)) return false; MyFriendsId other = (MyFriendsId) o; return new EqualsBuilder() .append(getMeId(), other.getMeId()) .append(getMyFriendId(), other.getMyFriendId()) .isEquals(); } public int hashcode() { return new HashCodeBuilder() .append(getMeId()) .append(getMyFriendId()) .hashCode(); } } }