【问题标题】:How to use @AttributeOverrides when used method access to property?使用方法访问属性时如何使用@AttributeOverrides?
【发布时间】:2017-08-11 19:51:14
【问题描述】:

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

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

实体映射中的重复列:...列:grn_date(应该是 映射为 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;

    //...
}

谁能建议在这种情况下如何正确覆盖属性?或者有什么解决办法?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    我找到了解决方案。这对我来说相当棘手。

    在嵌入的类中,它需要设置不是列名而是变量名,在我的例子中是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 也应该与属性名称完全匹配。

    【讨论】:

      猜你喜欢
      • 2021-10-26
      • 2015-04-04
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      相关资源
      最近更新 更多