实体映射中的重复列:Shipper列:SHIPPER_ID(应使用insert =“false”映射)

时间:2014-05-21 17:15:30

标签: spring hibernate

我一直在圈子里出现这个错误,不知道为什么我会这样做。

这是Shipper类的映射

@Entity
@Table(schema="SALONBOOKS",name="SHIPPER")
@AttributeOverride(name="id", column=@Column(name="SHIPPER_ID"))
public class Shipper extends SalonObject {

    private static final long serialVersionUID = 1L;
    private ShipperType name;//ShipperType.WALKIN;

    @Column(name="SHIPPER_NAME")
    @Enumerated(EnumType.STRING)
    public ShipperType getName() {
        return name;
    }

    public void setName(ShipperType name) {
        this.name = name;
    }

    @Override   
    public Long getId(){
        return id;
    }
}

这是引用托运人的订单类

@Entity
@Table(schema="SALONBOOKS",name="ORDER")
@AttributeOverride(name="id", column=@Column(name="ORDER_ID"))
public class Order extends SalonObject {

    private static final long serialVersionUID = 1L;
    private BigDecimal total= new BigDecimal(0.0);
    private int numOfItems=0;
    private BigDecimal tax= new BigDecimal(0.0);;
    private String currency="USD";
    private BigDecimal subTotal= new BigDecimal(0.0);
    private PaymentMethod paymentMethod;
    private Shipper shipper;
    private OrderStatusType status;
    private Appointment appointment ;
    private Person person;

    @Column(name="TOTAL")
    public BigDecimal getTotal() {
        return total;
    }
    public void setTotal(BigDecimal total) {
        this.total = total;
    }
    @Column(name="NUM_OF_ITEMS")
    public int getNumOfItems() {
        return numOfItems;
    }
    public void setNumOfItems(int numOfItems) {
        this.numOfItems = numOfItems;
    }
    @Column(name="TAX")
    public BigDecimal getTax() {
        return tax;
    }
    public void setTax(BigDecimal tax) {
        this.tax = tax;
    }
    @Column(name="CURRENCY")
    public String getCurrency() {
        return currency;
    }
    public void setCurrency(String currency) {
        this.currency = currency;
    }
    @Column(name="SUBTOTAL")
    public BigDecimal getSubTotal() {
        return subTotal;
    }
    public void setSubTotal(BigDecimal subTotal) {
        this.subTotal = subTotal;
    }

    @ManyToOne
    @JoinColumn(name="PAYMENT_METHOD_ID", insertable=false,updatable=false)
    public PaymentMethod getPaymentMethod() {
        return paymentMethod;
    }
    public void setPaymentMethod(PaymentMethod paymentMethod) {
        this.paymentMethod = paymentMethod;
    }
    @ManyToOne
    @JoinColumn(name="SHIPPER_ID", insertable=false,updatable=false)
    public Shipper getShipper() {
        return shipper;
    }
    public void setShipper(Shipper shipVia) {
        this.shipper = shipVia;
    }
    @Column(name="STATUS")
    @Enumerated(EnumType.STRING)
    public OrderStatusType getStatus() {
        return status;
    }
    public void setStatus(OrderStatusType status) {
        this.status = status;
    }
    @ManyToOne
    @JoinColumn(name="APPOINTMENT_ID", insertable=false,updatable=false)
    public Appointment getAppointment() {
        return appointment;
    }
    public void setAppointment(Appointment appointment) {
        this.appointment = appointment;
    }
    @ManyToOne
    @JoinColumn(name="PERSON_ID", insertable=false,updatable=false)
    public Person getPerson() {
        return person;
    }
    public void setPerson(Person person) {
        this.person = person;
    }       

    @Override
    public Long getId(){
        return id;
    }   
}

每个都延伸:

@MappedSuperclass
public abstract class SalonObject implements Entity, Serializable {

    private static final long serialVersionUID = 1L;
    protected Long id;
    protected DateTime createDate;
    protected DateTime updateDate;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public Long getId() {
        return id;
    }

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

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof SalonObject 
                && obj !=null){
            return ObjectUtils.equals(this.id, ((SalonObject) obj).getId()) ;
        }
        return false;
    }
    @Column(name="CREATE_DATE")
    public DateTime getCreateDate() {
        return createDate;
    }

    public void setCreateDate(DateTime dateTime) {
        this.createDate = dateTime;
    }
    @Column(name="UPDATE_DATE")
    public DateTime getUpdateDate() {
        return updateDate;
    }

    public void setUpdateDate(DateTime updateDate) {
        this.updateDate = updateDate;
    }
}

stackTrace是::

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: salonbooks.model.Shipper column: SHIPPER_ID (should be mapped with insert="false" update="false")
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:709)
    at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:731)
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:753)
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:506)
    at org.hibernate.mapping.RootClass.validate(RootClass.java:270)
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1358)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1849)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1928)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:343)
    at salonbooks.core.HibernateConfiguration.sessionFactory(HibernateConfiguration.java:109)

1 个答案:

答案 0 :(得分:1)

从Shipper和Order中删除以下方法可以解决此错误

@Override   
public Long getId(){
    return id;
}

因为您正在使用属性访问,所以通过覆盖基本方法(包含映射配置),您将替换基本方法映射配置,而不使用任何配置。

使用字段访问不会导致此问题,但无论如何覆盖都是无用的。 id字段也应具有私有访问权限,因此如果更改访问修饰符,此方法将无法编译。