java - 实体映射中的重复列应使用插入 ="false"更新 ="false"进行映射

标签 java hibernate annotations

我有一个 pojo 类地址,我正在尝试构建一个数据库表,其中应该有不同的家庭地址和办公室地址。我正在使用 AttributeOverride 注释来使地址类分别显示办公室地址和家庭地址的属性,但是我遇到了以下问题。 线程“main”org.hibernate.MappingException 中出现异常:实体映射中的重复列:org.blogPost.Employee 列:CITY_NAME(应使用 insert="false"update="false"进行映射)

请查看下面的代码并提出正确的修复建议。

主类。

    package org.blogPost;
    import java.util.Date;

    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.AnnotationConfiguration;

    public class TestEmployee {

        public static void main(String[] args) {
            SessionFactory sessionfactory = new 
            AnnotationConfiguration().configure().buildSessionFactory();
            Session session = sessionfactory.openSession();
            session.beginTransaction();
            Date date= new Date();
            Employee emp1= new Employee();
            Address addr= new Address();
            Address home_addr= new Address();
            addr.setStreet("This is a test street");
            addr.setCity("test city");
            addr.setPincode("test Pin");
            home_addr.setStreet("Home Street Test");
            home_addr.setCity("Home test home");
            home_addr.setPincode("Test_home pin");
            //emp1.setEmpId(101);
            emp1.setEmpName("Employee five");
            emp1.setEmpLastName("Employee five SirName");
            emp1.setNumber(7755);
            emp1.setEmail("emp55@hibernate.com");
            emp1.setAddress(home_addr);
            emp1.setOfficeAddress(addr);
            emp1.setEmpLoginTime(date);
            session.save(emp1);
            session.getTransaction().commit();
            emp1= null;

            session=sessionfactory.openSession();
            session.beginTransaction();
            emp1=(Employee)session.get(Employee.class, 1);
            System.out.println("Below is the user details");
            System.out.println("Employee ID : "+emp1.getEmpId());
            System.out.println("Employee Name : "+emp1.getEmpName());
            System.out.println("Employee Address : "+emp1.getAddress());
            System.out.println("Employee email ID : "+emp1.getEmail());

        }
    }

我面临问题的员工类(class)。

package org.blogPost;

import java.util.Date;

import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name="EmployeeInfo")
public class Employee {

    private int empId;
    private String empName;
    private String empLastName;
    private long number;
    private String email;
    private Date empLoginTime;
    private Address address;

    @AttributeOverrides({
    @AttributeOverride 
    (name="street",column=@Column(name="HOME_STREET_ADDRESS")),
    @AttributeOverride 
    (name="city",column=@Column(name="HOME_CITY_ADDRESS")),
    @AttributeOverride 
        (name="pincode",column=@Column(name="HOME_PIN_CODE"))   
    })
    private Address officeAddress;

    @Id
    @GeneratedValue(strategy=GenerationType.TABLE,generator="empID")
      @TableGenerator(name="empID",table="empPrimaryKey",pkColumnName="empKey",pkColumnValue="empValue",allocationSize=1)
    @Column(name="EmployeeId",nullable=false)
    public int getEmpId() {
        return empId;
    }
    public void setEmpId(int empId) {
        this.empId = empId;
    }
    @Column(name="First_Name",nullable=false)
    public String getEmpName() {
        return empName;
    }
    public void setEmpName(String empName) {
        this.empName = empName;
    }
    @Column(name="Last_Name",nullable=false)
    public String getEmpLastName() {
        return empLastName;
    }
    public void setEmpLastName(String empLastName) {
        this.empLastName = empLastName;
    }
    @Column(name="Phone_number")
    public long getNumber() {
        return number;
    }
    public void setNumber(long number) {
        this.number = number;
    }
    @Column(name="Email_Address",nullable=false)
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    @Temporal(TemporalType.TIMESTAMP)
    public Date getEmpLoginTime() {
        return empLoginTime;
    }
    public void setEmpLoginTime(Date empLoginTime) {
        this.empLoginTime = empLoginTime;
    }
    @Embedded
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    @Embedded
    public Address getOfficeAddress() {
        return officeAddress;
    }
    public void setOfficeAddress(Address officeAddress) {
        this.officeAddress = officeAddress;
    }


}

地址类别。 包 org.blogPost;

import javax.persistence.Column;
import javax.persistence.Embeddable;

@Embeddable
public class Address {

    private String street;
    private String city;
    private String pincode;

    @Column(name="STREET_NAME")
    public String getStreet() {
        return street;
    }
    public void setStreet(String street) {
        this.street = street;
    }
    @Column(name="CITY_NAME")
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    @Column(name="PIN_CODE")
    public String getPincode() {
        return pincode;
    }
    public void setPincode(String pincode) {
        this.pincode = pincode;
    }

}

下面是我运行代码时遇到的异常。

Exception in thread "main" org.hibernate.MappingException: Repeated column in mapping for entity: org.blogPost.Employee column: CITY_NAME (should be mapped with insert="false" update="false")
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:670)
    at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:692)
    at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:688)
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:714)
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:468)
    at org.hibernate.mapping.RootClass.validate(RootClass.java:215)
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1149)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1334)
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
    at org.blogPost.TestEmployee.main(TestEmployee.java:12)

最佳答案

请在 getter 方法(public Address getOfficeAddress())上保留 @AttributeOverrides 注解,就像在其他成员变量的 getter 方法(public int getEmpId())上使用注解一样。它会起作用的。

关于java - 实体映射中的重复列应使用插入 ="false"更新 ="false"进行映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49663715/

相关文章:

java - @Async API 端点 Spring Webflux

java - 在本地重现和解决 Android java.lang.unsatisfiedLinkError

java - Jackson 反序列化为默认子类型

java - 随着应用程序的增长,Struts 2 验证无法正常工作

Java Spring 如果出错则切换服务

java - spring Kafka集成测试监听器不工作

java - 哪种 m2eclipse 原型(prototype)可用于基于 JBoss/Hibernate 的项目?

hibernate - 如何让 Hibernate 调用我的自定义 typedef?

java - Hibernate:如果外键为空,则按链接表中的字段排序

java - 如何访问 RetentionPolicy.CLASS java 注释?