Java org.hibernate.MappingException:实体映射中的重复列

Java org.hibernate.MappingException:实体映射中的重复列,java,hibernate,Java,Hibernate,我有两个域模型:“UserBean”和“LoginBean”。这是一种一对多的关系,一个用户有许多登录记录。 LoginBean.userid是UserBean.id的外键。 以下是数据库的DDL: CREATE TABLE `users` ( `id` int(11) NOT NULL, `username` varchar(255) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, `register_date` date

我有两个域模型:“UserBean”和“LoginBean”。这是一种一对多的关系,一个用户有许多登录记录。 LoginBean.userid是UserBean.id的外键。 以下是数据库的DDL:

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`)
) 
以及:

当我运行应用程序时,我会收到一条消息:
实体映射中的重复列:LoginBean column:user\u id(应该用insert=“false”update=“false”映射)
但我检查了每个地方,我从未在“LoginBean”中定义过两次“用户id”。
这就是为什么?谢谢

这个错误仅仅是因为您两次声明了id,并且为id声明了getter和setter。 i、 e:在LoginBean类和UserBean类中。如果要从第二个类中删除id,则不会出现错误。可以编写insertable=false和updateable=false

私有整数id//主键


请检查您是否错误地在那里创建了getter和setter。

您的映射是双向关联。将UserBean作为父对象,将LoginBean作为子对象。所以您有两个到user_id表的映射

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

当userid和user.id试图映射到user_id时。完全删除userid字段将为您解决问题,我认为您已经尝试过了


解释:@ManyToOne标记只是让我们去看看ManyToOne标记的类的关联映射。当它转到UserBean时,它发现LoginBean通过LoginBean的“user”属性与UserBean相关联。因此,hibernate将尝试将UserBean的id映射到标记为FK(在db中)的LoginBeans字段到user表。

非常感谢!当我写“insertable=false和updateable=false”时,它做得很好。但我仍然不知道LoginBean在哪里反复定义了“用户id”。我把成员变量“userid”指定为列名“user_id”,这不正确吗?@fortream请检查我的更新答案,如果问题解决了,请不要忘记接受answer@Mike,这只是一个POJO类。如果我删除注释,那么只有几个属性(getter/setter方法)。“id”指向表的主键,“user_id”是LoginBean的外键,是UserBean的主键。我将数据库的DDL与更新后的问题放在一起。@fortream请在@OneToMany(mappedBy=“user”,cascade={CascadeType.MERGE})之后添加@JoinColumn(name=“your id”),您只需更改连接列名,使其不再与主键冲突,也请通过此链接@Mike我无法在OneToMany之后添加JoinColumn。它告诉我一条消息(org.hibernate.AnnotationException):标记为mappedBy的关联不能定义@JoinTable或@jointColumn之类的数据库映射。我想级联更新表,所以我猜可能有两个成员变量来指定一个字段,它抛出一个异常。但是我找不到指定的变量“user_id”字段,除了LoginBean“userid”变量。我尝试将LoginBean设置为“userid”insertable=false和updateable=false,以正常工作。所以我猜某个地方引用了UserBean中的user\u 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;
        }
    }

 @Column(name = "user_id", nullable = false)
    private Integer userid;
@ManyToOne
    @ElementCollection(targetClass = fordream.hibernate.bean.UserBean.class)
    private UserBean user;