2013-10-02 13 views
1

Кто-нибудь знает, как указать конкретное имя столбца со следующим простым примером?Как указать имена столбцов JPA?

@Entity 
public class Role { 
    @Id 
    @GeneratedValue 
    @Column(name="id") 
    private final Integer id; 

    ... 
} 

@Entity 
public class User { 
    @Id 
    @GeneratedValue 
    @Column(name="id") 
    private final Long id; 

    @ElementCollection 
    @CollectionTable(name = "user_roles" joinColumns = { @JoinColumn(name = "user_id")}) 
    private final Set<Role> roles; 

    ... 
} 

Это удручающе результаты в таблице под названием "user_roles" и имена полей: "user_id" и "roles_id".

Почему «role_id», а не «role_id», и как я могу изменить это на «role_id»?

Для чего я использую JPA 2.0, MySQL и Hibernate. Данные, которые я хочу добавить, добавляются правильно, так что это всего лишь вопрос вкуса.

Edit:

Следующая может быть немного JPA 1.0'ish, но он работает, как требуется.

@ManyToMany 
@JoinTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id")) 

ответ

2

Используйте следующие annotaion в User Entity:

@ElementCollection 
@CollectionTable(name = "user_roles") 
@Column(name = "role_id") 
private Set<Role> roles; 
+0

Спасибо, я тоже пробовал, но ничего не меняется. К сожалению, он по-прежнему использует «role_id». com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Неизвестный столбец «role_id» в «списке полей» – Raoul

+0

Какую версию JPA вы используете? – Masudul

+0

Если вы создаете схему из java-кода, чем используйте тип генерации drop-and-create или вручную удаляете таблицу. – Masudul

0

Из гибернации ссылки: http://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html_single/

Используйте следующую аннотацию в вашей пользователя лица:

@ElementCollection 
@CollectionTable(name="user_roles", [email protected](name="user_id")) 
@Column(name="role_id") 
public Set<Role> getRoles() { ... } 
+0

Спасибо, проверит это. Единственное отличие от вышеизложенного состоит в том, что аннотации находятся на «getter» (учитывая, что мы уже добавили часть @Column, которая, к сожалению, не изменила ситуацию). – Raoul

0

Я думаю, проблема кроется в @ElementCollection. Кажется, он более подходит для простых типов. Я буду придерживаться аннотации @ManyToMany, как указано в моем редактировании на вопрос. Похоже, эта тема была рассмотрена по-другому: Difference between @OneToMany and @ElementCollection?

0

Неправильное отображение. Роль - это сущность, но @ElementCollection следует использовать с базовыми типами или Embeddables.

Если роль является @Entity, то я хотел бы предложить вам нужен @ManytoMany с на @JoinTable spcifying объединения и обратного столбцам

В противном случае вы можете сделать роль Встраиваемый и использовать @ElementCollection, который даст вам один для многих с таблицей user_roles что-то вроде user_id, role_name.

Любой из них будет генерировать вашу схему, как указано.

+0

Спасибо, я уже пришел к такому выводу в своем ответе выше. – Raoul

Смежные вопросы