Java 映射同一类关系
嗨 我正在尝试在hibernate中映射一些类,但对于如何进行这种映射,我有一个普遍的问题。 用户类和Facebook用户类的结构如下 用户类别:Java 映射同一类关系,java,hibernate,orm,Java,Hibernate,Orm,嗨 我正在尝试在hibernate中映射一些类,但对于如何进行这种映射,我有一个普遍的问题。 用户类和Facebook用户类的结构如下 用户类别: public class User{ public User(){} Long Id; String FirstName; String LastName; .... FbUser fbuser; //// all requred getters and setters... } Facebook类FbUser可以拥有属于同一类F
public class User{
public User(){}
Long Id;
String FirstName;
String LastName;
....
FbUser fbuser;
//// all requred
getters and setters...
}
Facebook类FbUser可以拥有属于同一类FbUser对象的好友列表
public class FbUser{
public FbUser(){}
Long fbId;
String FirstName;
String LastName;
List<FbUser> friends;
//// all requred
getters and setters...
}
公共类用户{
公共FbUser(){}
长fbId;
字符串名;
字符串LastName;
列出朋友;
////所有要求
接球手和接球手。。。
}
到目前为止,我在用户和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映射文件中映射FbUser列表吗?我迷路了:(好吧,首先:用户和FbUser有一对一的关系,对吗? 第二:使用列表或集合将FbUser映射为多对多关系。我这里有一个集合示例:
<set
name="friends"
table="FbUser" <!-You may use other table here if you want->
access="field">
<key
column="fbId"/>
<many-to-many
class="bla.bla.bla.FbUser"
column="friend_id" />
</set>
首先:用户与FbUser有一对一的关系,对吗? 第二:使用列表或集合将FbUser映射为多对多关系。我这里有一个集合示例:
<set
name="friends"
table="FbUser" <!-You may use other table here if you want->
access="field">
<key
column="fbId"/>
<many-to-many
class="bla.bla.bla.FbUser"
column="friend_id" />
</set>
您可以创建一个名为MyFriends的附加类
public class FbUser {
List<MyFriends> friends = new ArrayList<MyFriends>();
}
您可以创建一个名为MyFriends的附加类
public class FbUser {
List<MyFriends> friends = new ArrayList<MyFriends>();
}
您好,您的解决方案很吸引人。但是,请您解释一下,如果我没有索引行,为什么我应该使用集合而不是列表?为什么我需要复合主键?@danny.lesnik如果您使用列表,Hibernate会抱怨您没有索引列。请参阅此处原因:您需要复合主键,因为您的多个关系“已拆分”为一个OneToMany关系。当多个关系拆分为一个OneToMany时,您需要一个复合主键。多个与OneToMany类似(具有复合主键)@danny.lesnik请记住@Plinio Pantaleão提供的解决方案也很好。但他使用集合。如果您没有一致的equals和hashCode方法,则更喜欢使用袋子。否则,您可能会出现意外行为。@danny.lesnik只是一个更正:manytomy类似于one many manytomone FbUser具有one-one关系p与MyFriend(集合)和MyFriend与FbUser有多人关系。当您将多人拆分为一人多人多人时,加入的类(MyFriend)有一个复合主键。请看这里的另一个例子嗨,你可以帮助我完成这个主题吗?这是你建议的实现。嗨,你的解决方案很吸引人。但是,你能解释一下,如果我没有索引行,为什么我应该使用集合而不是列表?如果你使用列表,为什么我需要复合主键?@danny.lesnik,Hibernate会抱怨您没有索引列。请参阅此处原因:您需要复合主键,因为您的多人关系“已拆分”为一人多人关系。当多人多人关系拆分为一人多人关系时,您需要复合主键。多人多人与一人多人类似(使用复合主键)@danny.lesnik请记住@Plinio Pantaleão提供的解决方案也很好。但他使用集合。如果您没有一致的equals和hashCode方法,则更喜欢使用袋子。否则,您可能会出现意外行为。@danny.lesnik只是一个更正:manytomy类似于one many manytomone FbUser具有one-one关系p与MyFriend(Collection)和MyFriend与FbUser具有多人关系。当您将多人拆分为一人多人多人时,加入的类(MyFriend)具有复合主键。请参见此处的另一个示例Hi,您是否可以帮助我完成此主题?这是您建议的实现。
<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>
<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>
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();
}
}
}