Добавлен ненужный столбец при попытке установить связь OneToMany - PullRequest
0 голосов
/ 07 июня 2011

Я пытаюсь установить отношение OneToMany между автором и его сообщениями, используя автор в качестве внешнего ключа и имя пользователя в качестве первичного ключа, используя Java EE 6 и toplink + eclipselink в качестве поставщика постоянства.

Здесьвот что у меня есть:

Аннотации в классе User

@Id
@NotNull(message = "Please enter username")
@Size(min = 8, max = 40)
@Column(unique=true, nullable=false) 
private String username;

...

private Collection<BlogEntry> blg = new ArrayList<BlogEntry>();

    @OneToMany(cascade = {CascadeType.ALL}, mappedBy="user")
    public Collection<BlogEntry> getBlg() {
        return blg;
    }

Аннотации в классе BlogEntry

    @NotNull
    @Size(min = 8, max = 40)
    private String author;

... 

private User user;

    @ManyToOne()
    public User getUser() {
        return user;
    }

Проблема заключается в том, что новый столбец (USER_USERNAME) добавляется, когдавставка значений в BlogEntry Table, которая, конечно, показывает ошибку поля, не существующего в BlogEntry:

INSERT INTO BLOGENTRY (ID, CONTENT, AUTHOR, TITLE, CREATED, USER_USERNAME) VALUES (?, ?, ?, ?, ?, ?)
    bind => [301, xxxxxxxx, xxxxxxxx, xxxxxxxx, 2011-06-07 12:49:07.014, null]

Я был бы очень рад узнать, почему такой столбец добавлен или что исправить, чтобы получить простойСвязь OneToMany с использованием полей имени пользователя и автора.Я искал и перепробовал много уроков, но, похоже, что-то упустил.

1 Ответ

2 голосов
/ 07 июня 2011

Если вы хотите использовать существующий столбец AUTHOR в качестве внешнего ключа, необходимо сопоставить отношение «многие к одному» с этим столбцом следующим образом:

@ManyToOne()
@JoinColumn(name = 'author')
private User user;

Обратите внимание, что в типичном случае выможет удалить отдельное поле author из класса, поскольку теперь его можно получить как user.getUsername().Если вам нужны оба поля в классе, вам нужно пометить одно из них как доступное только для чтения с помощью insertable = false, updateable = false, поскольку только одно поле для чтения и записи может быть сопоставлено с конкретным столбцом.

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