У меня есть класс User. Пользователь может быть другом со многими другими пользователями. Отношения взаимны. Если A является другом B, то B является другом A. Также я хочу, чтобы каждое отношение хранило дополнительные данные - например, дату, когда два пользователя стали друзьями. Таким образом, это отношение "многие ко многим" в одной таблице с дополнительными столбцами. Я знаю, что должна быть создана дружба среднего класса (содержащая два идентификатора пользователя и столбец для даты). Но я не собираюсь сопоставлять это с Hibernate. То, что меня останавливает, - это сопоставление с одной таблицей. Я могу решить это, если отношения "многие ко многим" были между двумя разными таблицами.
Многие-ко-многим в одной таблице с дополнительными столбцами
Ответ 1
Вы сказали
отношение "многие ко многим" в той же таблице
Это не очень хорошая идея. Это кошмар для поддержания.
Попробуйте вместо этого
@Entity
public class Friend {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer friendId;
@Column
private String name;
@OneToMany(mappedBy="me")
private List<MyFriends> myFriends;
}
@Entity
public class MyFriends {
@EmbeddedId
private MyFriendsId id;
@Column
private String additionalColumn;
@ManyToOne
@JoinColumn(name="ME_ID", insertable=false, updateable=false)
private Friend me;
@ManyToOne
@JoinColumn(name="MY_FRIEND_ID", insertable=false, updateable=false)
private Friend myFriend;
@Embeddable
public static class MyFriendsId implements Serializable {
@Column(name="ME_ID", nullable=false, updateable=false)
private Integer meId;
@Column(name="MY_FRIEND_ID", nullable=false, updateable=false)
private Integer myFriendId;
public boolean equals(Object o) {
if(o == null)
return false;
if(!(o instanceof MyFriendsId))
return false;
MyFriendsId other = (MyFriendsId) o;
if(!(other.getMeId().equals(getMeId()))
return false;
if(!(other.getMyFriendId().equals(getMyFriendId()))
return false;
return true;
}
public int hashcode() {
// hashcode impl
}
}
}
С уважением,
Ответ 2
Я не уверен, что это подойдет вашему делу, но попробуй.
@Entity
public class Friend {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int friendId;
@Column
private String name;
@ManyToMany(mappedBy="owner")
private List<Friendship> friendships;
}
@Entity
public class Friendship {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int friendshipId;
@OneToOne
private Friend owner;
@OneToOne
private Friend target;
// other info
}
Ответ 3
У меня была та же проблема. Вы можете попробовать что-то вроде этого:
<class name="Friend" entity-name="RelatedFriend" table="FRIENDS">
<id name="id" type="long">
<generator class="native" />
</id>
<!-- *** -->
<set name="relatedFriends" table="RELATED_FRIENDS">
<key column="FRIEND_ID" />
<many-to-many column="RELATED_FRIEND_ID" class="Friend" entity-name="RelatedFriend"/>
</set>
</class>