2013-03-15 4 views
56

Я пытаюсь использовать аннотацию hibernate для написания класса модели для моих таблиц базы данных.Как создать ограничение внешнего ключа с помощью аннотаций спящего режима?

У меня есть две таблицы, каждая из которых имеет первичный ключ пользователя и вопрос.

@Entity 
@Table(name="USER") 
public class User 
{ 
    @Id 
    @Column(name="user_id") 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 

    @Column(name="username") 
    private String username; 

    // getter and setter 
} 

Таблица вопросов.

@Entity 
@Table(name="QUESTION") 
public class Questions extends BaseEntity{ 

    @Id 
    @Column(name="question_id") 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int id; 

    @Column(name="question_text") 
    private String question_text; 

    // getter and setter 

} 

И у меня есть еще одна таблица, UserAnswer, который имеет USERID и QuestionID как внешние ключи из вышеупомянутых двух таблиц.

Но я не могу найти, как я могу ссылаться на эти ограничения в таблице UserAnswer.

@Entity 
@Table(name="UserAnswer ") 
public class UserAnswer 
{ 

    @Column(name="user_id") 
    private User user; 

    //@ManyToMany 
    @Column(name="question_id") 
    private Questions questions ; 

    @Column(name="response") 
    private String response; 

    //getter and setter 
} 

Пожалуйста, помогите мне достичь этого? Спасибо заранее.

ответ

51

@Column не является подходящей аннотацией. Вы не хотите хранить целостный Пользователь или Вопрос в столбце. Вы хотите создать связь между сущностями. Начните с переименования Questions в Question, так как экземпляр представляет собой один вопрос, а не несколько. Затем создайте ассоциацию:

@Entity 
@Table(name = "UserAnswer") 
public class UserAnswer { 

    // this entity needs an ID: 
    @Id 
    @Column(name="useranswer_id") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @ManyToOne 
    @JoinColumn(name = "user_id") 
    private User user; 

    @ManyToOne 
    @JoinColumn(name = "question_id") 
    private Question question; 

    @Column(name = "response") 
    private String response; 

    //getter and setter 
} 

Hibernate documentation объясняет это. Прочтите. А также прочитайте javadoc аннотаций.

+0

Благодарим вас за ответ. Нужно ли создавать новый столбец в таблице как useranswer_id? Возможно ли, что я могу сделать другие два идентификатора в виде составных клавиш? – vikiiii

+2

Возможно, но это плохой дизайн, болезненный, сложный в использовании и неэффективный. Соблюдайте правильные вещи и назначьте автогенерированный идентификатор с одним столбцом ко всем вашим объектам. –

+0

@JB_Nizet Я не возражаю, добавив столбец id в объект. Но мне нужно также добавить столбец в таблицу? Я имею в виду базу данных оракула. – vikiiii

1

Аннотации @Join column(name="reference_column_name") можно использовать над этим свойством или полем класса, на которое ссылается какой-либо другой объект.

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