使用方法访问属性时如何使用@AttributeOverrides?

时间:2017-08-11 09:06:42

标签: java hibernate

我有一个具有方法访问权限的可嵌入类属性。它工作正常,直到我必须使用@AttributeOverrides的另一个类中有两个或更多包含。

在这种情况下,我从Hibernate收到以下错误:

  

实体映射中的重复列:... column:grn_date(应该是   map with insert =“false”update =“false”)

看来Hibernate由于某些原因不了解方法访问。如果我使用公共属性访问一切正常,但我需要当前的一个从XMLGregorianCalendar字段获取日历日期。

可嵌入课程:

@Embeddable
@Access(AccessType.FIELD)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "...")
public class GrnType {

    @XmlAttribute(name = "...")
    @Transient
    protected String grn;

    @XmlAttribute(name = "...", required = true)
    @Transient
    protected XMLGregorianCalendar dateOfEntry;

    @Transient
    private Calendar calendarDate;


    @Access(AccessType.PROPERTY)
    @Column(name = "grn")
    public String getGrn() {
        return grn;
    }

    @Access(AccessType.PROPERTY)
    @Column(name = "grn_date")
    private Calendar getCalendarDate() {
         if(dateOfEntry!=null) {
             return new GregorianCalendar(dateOfEntry.getYear(), dateOfEntry.getMonth(), dateOfEntry.getDay());
         }else {
             return null;
         }
    }

    //   ...setters here

}

嵌入的类:

@Entity
@Table(name="RealEstateDFl")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {...})
public class GrnEntity {

    //...
    @Embedded
    @AttributeOverrides({
            @AttributeOverride(name = "grn", column = @Column(name = "grn_main")),
            @AttributeOverride(name = "grn_date", column = @Column(name = "grn_date_main"))
    })
    protected GrnType grnType;

    @Embedded
    @AttributeOverrides({
            @AttributeOverride(name = "grn", column = @Column(name = "grn_sec")),
            @AttributeOverride(name = "grn_date", column = @Column(name = "grn_date_sec"))
    })
    protected GrnType grnTypeSecondary;

    //...
}

在这种情况下,有人可以建议如何正确覆盖属性吗?或者可能是什么解决方案?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。这对我来说非常棘手。

在嵌入式的类中,它需要设置而不是列的名称,而是设置变量的名称,在我的情况下,它是 calendarDate

所以这是一个有效的例子:

@Entity
@Table(name="RealEstateDFl")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {...})
public class GrnEntity {

    //...
    @Embedded
    @AttributeOverrides({
            @AttributeOverride(name = "grn", column = @Column(name = "grn_main")),
            @AttributeOverride(name = "calendarDate", column = @Column(name = "grn_date_main"))
    })
    protected GrnType grnType;

    @Embedded
    @AttributeOverrides({
            @AttributeOverride(name = "grn", column = @Column(name = "grn_sec")),
            @AttributeOverride(name = "calendarDate", column = @Column(name = "grn_date_sec"))
    })
    protected GrnType grnTypeSecondary;

    //...
}

Embeddable类中的getter和setter也应该与属性名称完全匹配。