Использование JoinTable - PullRequest
       40

Использование JoinTable

2 голосов
/ 05 января 2012

Я пытаюсь создать подобный Твиттеру проект с использованием Java2EE, и вот простое представление базы данных.
Упоминание, подписчики и подписки - это три JoinTable. (Обратите внимание, что упомянутое, follower, follow и каждое пользовательское поле имеют User.username в качестве внешнего ключа.) У меня проблема с первым, который приводит к сбою моего развертывания с этим исключением:

Описание исключения: имя столбца ссылки [имя пользователя], сопоставленное элементу [упоминания полей], не соответствует действительному полю в ссылке сопоставления.

Вот отображение для двух сущностей.

Чирикать:

public class Tweet implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @NotNull
    @Column(name = "id", nullable = false)
    private Integer id;

    ...

    @JoinColumn(name = "user", referencedColumnName = "username")
    @ManyToOne
    User user;
    @JoinTable(name = "Mention", joinColumns = {
        @JoinColumn(name = "tweet", referencedColumnName = "id")}, inverseJoinColumns = {
        @JoinColumn(name = "mentioned", referencedColumnName = "username")})
    @OneToMany
    private Collection<Tweet> mentions;

Пользователь:

public class User implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 50)
    @Column(name = "username", nullable = false, length = 50)

    ...

    @OneToMany(mappedBy = "user")
    Collection<Tweet> tweets;
    @JoinTable(name = "Following", joinColumns = {
        @JoinColumn(name = "user", referencedColumnName = "username")}, inverseJoinColumns = {
        @JoinColumn(name = "following", referencedColumnName = "username")})
    @OneToMany
    Collection<User> following;
    @JoinTable(name = "Followers", joinColumns = {
        @JoinColumn(name = "user", referencedColumnName = "username")}, inverseJoinColumns = {
        @JoinColumn(name = "follower", referencedColumnName = "username")})
    @OneToMany
    Collection<User> followers;
    @OneToMany(mappedBy = "mentions")
    Collection<Tweet> mentioning;

Что не так с моим отображением? Может кто-нибудь указать мне на решение?

1 Ответ

0 голосов
/ 05 января 2012

Я думаю, что вы должны изменить

@JoinColumn(name = "mentioned", referencedColumnName = "username")

для указания пользовательской таблицы

@JoinColumn(name = "mentioned", referencedColumnName = "user")

Как правило, в сообщении говорится, что в вашей таблице tweet нет поля внешнего ключа username, которого нет, как вы его назвали user

Это -> private Collection<Tweet> mentions; также должно быть множество пользователей, оставляющих вас с

@OneToMany
@JoinTable(
    name = "Mention", 
    joinColumns = {
        @JoinColumn(name = "tweet", referencedColumnName = "id")
    }, 
    inverseJoinColumns = {
        @JoinColumn(name = "mentioned", referencedColumnName = "user")
    }
)    
private Collection<User> mentions;
...