当前位置: 首页 > 知识库问答 >
问题:

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

唐彦
2023-03-14

我有两个域模型:“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`)
) 
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;
        }
    }

当我运行应用程序时,我得到一条消息:< code >实体映射中的重复列:LoginBean列:user_id(应使用insert="false" update="false)进行映射)但是我检查了每个地方,我从未在“LoginBean”中定义“user_id”两次。这就是为什么?谢谢!

共有2个答案

范峰
2023-03-14

此错误只是因为您声明了两次id以及id的getter和setter。即:在LoginBean类以及UserBean类中。如果您将从第二个类中删除id,您将不会获得error.You可以编写可插入=false和可更新=false。

私有整数id;//PK

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

蒋弘致
2023-03-14

您的映射是双向关联。将UserBean作为父级,LoginBean作为子级。因此,您有两个到user_ id表的映射

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

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

用userid和user.id试图映射到user_id。完全删除userid字段将为你做这件事,我想你已经尝试过了。

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

 类似资料:
  • 问题内容: 我正在做一个简单的投票系统。我有2张桌子: :ID,姓名,姓氏 :ID,投票(布尔值),VoterID(实际上是),PersonID(实际上也是)。 我需要能够使用表中存储的人员来 满足* 这两个需求,从而确定 谁 进行投票以及 谁进行投票 。该表包含可以“投票”以及“被投票”的用户的用户详细信息。人们可以决定是否要为自己投票。 * 我已经将表映射到我的对象中,如下所示: 人 投票 错

  • 问题内容: 我是使用Maven和JBOSS处理JPA的初学者,通过Restful使我的应用程序出现以下问题,我在进行DEPLOY 不是那一步,检查所有posles解决方案,但是没有找到任何东西,有人可以帮我吗? 提前致谢 下面,我显示了我已经完成映射的postgres中的SQL代码。 我有三个表( 活动 , 事件 和 照片 ),其中一个表( 照片 )引用了另外两个表( 活动 和 事件 ),但是在一

  • 问题内容: 特定实体存在映射例外。不能弄清楚问题出在哪里。我从头到尾检查了所有映射3次。我仍然收到映射异常。 发送给员工的电子邮件仅映射一次。但它仍然报告错误重复映射 错误是: 电子邮件Pojo email.hbm.xml 相关脚本 发送给员工的电子邮件仅映射一次。但它仍然报告错误重复映射 问题答案: 您是否将Employee中的集合设置为逆?

  • > 状态: } 我在控制台得到的是: 或在创建类时 在这种情况下,如何正确创建实体或在表之间创建引用?

  • 问题内容: 尽管发布了其他所有文章,但在MacOSX和NetBeans 7.2上,我找不到GlassFish的此错误的解决方案。 这里的代码: Sale.java 客户.java 产品.java 问题答案: 消息很清楚:映射中有重复的列。这意味着您两次映射了相同的数据库列。实际上,您有: 并且: (/也一样)。 您不应通过其他实体的ID来引用它们,而应直接引用该实体。删除该字段,它是无用的。并针对

  • 问题内容: 我在使用JPA和Hibernate时遇到问题,但无法解决。 因此,这是我的applicationContext.xml: 这是我的表演实体: 这是我的嵌入式id类: 所以,这些是我的课程。但是,当我想运行我的应用程序时,会遇到以下异常: 我认为第一个例外是由第二个例外引起的。那么,为什么我会得到“实体映射中的重复列?”。使用嵌入式id类是个好主意吗? 问题答案: 你的两个变量,并在你的