Self ManyToMany с дополнительными столбцами с использованием JPA 2.0 - PullRequest
1 голос
/ 17 мая 2011

Я хочу создать вид дружеских отношений между моделями пользователей.Мне также нужны дополнительные столбцы для каждой дружбы.Я знаю, что мне нужно использовать присоединяющийся класс с составным первичным ключом.Вот мой класс пользователя

public class User implements Serializable {

@Id
@Basic(optional = false)
@Column(name = "id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;

@OneToMany(mappedBy="friendA")
private Set<Friendship> friends;

У меня также есть класс FriendshipId

@Embeddable
public class FriendshipId implements Serializable {
private long friendAId; 
private long friendBId;
}

И, наконец, класс Friendship

@Entity
@IdClass(FriendshipId.class)
public class Friendship implements Serializable {


private Integer friendAId;

private Integer friendBId;

@Basic(optional = false)
@Column(name="date_added")
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime date_added;


@ManyToOne
@PrimaryKeyJoinColumn(name="friendAId", referencedColumnName="friendAId")
private User friendA;

@ManyToOne
@PrimaryKeyJoinColumn(name="friendBId", referencedColumnName="friendBId")
private User friendB;
}

Это работает, но таблица базы данных, сгенерированная в моембаза данных состоит из каждого идентификатора дважды - я полагаю, один набор предназначен для первичного ключа, а второй - для внешних ключей.

Как я могу сделать этот PK уникальным - что дружба от A до B будет отвергнута, если есть B к A один?

Другой вопрос касается дизайна - это хороший способ достичь того, чего я хочу достичь?Я имею в виду использование составного ключа вместо просто собственного ПК для дружбы.

1 Ответ

0 голосов
/ 22 июня 2011

Полагаю, в сущности Friendship вы добавили сущность User дважды (очень хорошо), но почему там снова

private Integer friendAId;
private Integer friendBId;

?Это может быть причиной того, что ID генерируется дважды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...