2015-06-13 208 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") 但我檢查每一個地方,我從來沒有在「LoginBean」中定義了兩次「user_id」。 這就是爲什麼?謝謝 !

回答

1

您的映射是雙向關聯。將你的UserBean作爲Parent和LoginBean作爲Child。所以,你有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說明。完全刪除用戶ID字段將爲你做,我認爲你已經嘗試過。

解釋:@ManyToOne標籤只是說去看看ManyToOne標記的類爲關聯映射。當它轉到UserBean時,它發現LoginBean通過LoginBean的「user」屬性關聯到UserBean。因此,hibernate會嘗試將UserBean的id映射到用戶表標記爲FK(以db爲單位)的LoginBeans字段。

0

這個錯誤僅僅是因爲你聲明瞭id兩次id和getter和setter。 即:在LoginBean類以及UserBean類。如果您將從第二個類中移除該ID,則不會收到錯誤。您可以編寫insertable = false和updateable = false。

private Integer id; // PK

請檢查您是否有錯誤創建了getter和setter。

+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

相關問題