2015-06-13 2 views
2

У меня есть две модели домена: «UserBean» и «LoginBean». Это отношения «один ко многим», у пользователя много записей о логине. LoginBean.userid - это внешний ключ UserBean.id. Вот DDL из базы данных:org.hibernate.MappingException: Повторяющийся столбец при сопоставлении для объекта

CREATE TABLE `users` (
    `id` int(11) NOT NULL, 
    `username` varchar(255) DEFAULT NULL, 
    `password` varchar(255) DEFAULT NULL, 
    `register_date` datetime DEFAULT NULL, 
    PRIMARY KEY (`id`) 
)
CREATE TABLE `login` (
    `id` int(11) NOT NULL, 
    `user_id` int(11) NOT NULL, 
    `login_date` datetime NOT NULL, 
    `login_result` char(1) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `user_id` (`user_id`), 
    CONSTRAINT `login_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) 
)
 

    @Entity 
    @Table(name = "login") 
    public class LoginBean { 
     @Id 
     @Column(name = "id", nullable = false) 
     @GenericGenerator(name = "ddd", strategy = "increment") 
     @GeneratedValue(generator = "ddd") 
     private Integer id; //PK 

     // FK --> user.id 
     @Column(name = "user_id", nullable = false) 
     private Integer userid; 

     @Column(name = "login_date", nullable = false) 
     private Date logindate; 

     @Column(name = "login_result", nullable = false) 
     private Boolean loginresult; 

     @ManyToOne 
     @ElementCollection(targetClass = fordream.hibernate.bean.UserBean.class) 
     private UserBean user; 

     public Integer getId() { 
      return id; 
     } 

     public void setId(Integer id) { 
      this.id = id; 
     } 

     public Integer getUserid() { 
      return userid; 
     } 

     public void setUserid(Integer userid) { 
      this.userid = userid; 
     } 

     public Date getLogindate() { 
      return logindate; 
     } 

     public void setLogindate(Date logindate) { 
      this.logindate = logindate; 
     } 

     public Boolean getLoginresult() { 
      return loginresult; 
     } 

     public void setLoginresult(Boolean loginresult) { 
      this.loginresult = loginresult; 
     } 

     public UserBean getUser() { 
      return user; 
     } 

     public void setUser(UserBean user) { 
      this.user = user; 
     } 
    } 

И:



    @Entity 
    @Table(name = "users") 
    public class UserBean { 
     @Id 
     @GenericGenerator(name = "abc", strategy = "increment") 
     @GeneratedValue(generator = "abc") 
     private Integer id; //PK 

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

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

     @Column(name = "register_date") 
     private Date register_date; 

     @OneToMany(mappedBy = "user", cascade = { CascadeType.MERGE }) 
     private Set loginset; 

     public Set getLoginset() { 
      return loginset; 
     } 

     public void setLoginset(Set loginset) { 
      this.loginset = loginset; 
     } 

     public Integer getId() { 
      return id; 
     } 

     public void setId(Integer id) { 
      this.id = id; 
     } 

     public String getUsername() { 
      return username; 
     } 

     public void setUsername(String username) { 
      this.username = username; 
     } 

     public String getPassword() { 
      return password; 
     } 

     public void setPassword(String password) { 
      this.password = password; 
     } 

     public Date getRegister_date() { 
      return register_date; 
     } 

     public void setRegister_date(Date register_date) { 
      this.register_date = register_date; 
     } 
    } 

При запуске приложения, я получаю сообщение: Repeated column in mapping for entity: LoginBean column: user_id (should be mapped with insert="false" update="false") Но я проверил все места, я никогда «user_id» дважды в «LoginBean». Вот почему? Благодаря !

ответ

1

Ваше сопоставление является двунаправленной ассоциацией. с вашим UserBean как родителем и LoginBean как ребенок. Таким образом, у вас есть 2 отображения на user_id таблицы

@Column(name = "user_id", nullable = false) 
    private Integer userid; 

И

@ManyToOne 
    @ElementCollection(targetClass = fordream.hibernate.bean.UserBean.class) 
    private UserBean user; 

с идентификатором пользователем и user.id пытаются сопоставить user_id. Полностью удаление поля userid сделает это за вас, о котором я думаю, что вы уже пробовали.

Объяснение: тег @ManyToOne просто говорит, чтобы пойти и посмотреть класс, отмеченный ManyToOne для сопоставлений ассоциаций. И когда он переходит к UserBean, он обнаруживает, что LoginBean связан с UserBean с помощью свойства «user» для LoginBean. Таким образом, hibernate попытается сопоставить идентификатор UserBean с полем LoginBeans, помеченным как FK (в db) в таблицу пользователя.

0

Эта ошибка объясняется только тем, что вы объявляете id два раза, а также getter и setter для id. i.e: В классе LoginBean, а также в классе UserBean. Если вы удалите идентификатор из второго класса, вы не получите ошибку. Вы можете написать insertable = false и updateable = false.

частный Integer id; // PK

и, пожалуйста, проверьте, что вы по ошибке создали геттер и сеттер.

+0

Спасибо большое! Когда я пишу «insertable = false и updateable = false», он делает все правильно. Но я до сих пор не знаю, где LoginBean многократно определяет «user_id». Я поместил переменные-члены «userid», указав имя столбца «user_id», это неверно? – forDream

+0

@forDream, пожалуйста, проверьте мой обновленный ответ, если он решен, не забыл принять ответ – Make

+0

@Mike, это только класс POJO. Если я удалю аннотации, всего несколько свойств (метод getter/setter). «id» указывает на первичный ключ таблицы, «user_id» - это внешний ключ LoginBean, и это первичный ключ UserBean. Я поставил DDL моей базы данных с обновленным вопросом. – forDream

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

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