org.hibernate.AnnotationException:引用的属性不是(一个|多个)ToOne:

时间:2016-10-12 21:34:06

标签: java hibernate jpa one-to-one

我正在尝试使用Hibernate建立OneToOne关系。我尝试过做其他问题的建议,但我仍然遇到问题。

我有一个公司类,它有自己的仓库规则集。每个实体都有一个BusinessUnitNumber作为表的Id。

@Entity(name="COBUSMST")
public class Company implements Serializable{
    private static final long serialVersionUID = 2573441991172174342L;
    private Integer businessUnit;
    private String longName;
    private String shortName;
    private String address1;
    private String address2;
    private String city;
    private String state;
    private String zipCode;
    private String returnAddress1;
    private String returnAddress2;
    private String returnCity;
    private String returnState;
    private String returnZipCode;
    private int phoneNumber;
    private int areaCode;
    private boolean replacementCharge;
    private BigDecimal replacementChargeAmount;
    private String customerServiceKeycode;
    private BigDecimal restockPercent;
    private Integer enterpriseId;
    private String country;
    private String returnCountry;
    private int phoneExtension;
    private String phoneType;
    private String giftCardItemNumber;
    private boolean implementationStatus;
    private int defaultWebsiteId;
    private BigDecimal callTagFee;

    @OneToOne
    @JoinColumn(name="BUSUNTNBR")
    private WarehouseRules warehouseRules;

    /**
     * @return the businessUnit
     */
    @Id
    @Column(name="BUSUNTNBR")
    public Integer getBusinessUnit() {
        return businessUnit;
    }
    /**
     * @param businessUnit the businessUnit to set
     */
    public void setBusinessUnit(Integer businessUnit) {
        this.businessUnit = businessUnit;
    }
    /**
     * @return the longName
     */
    @Column(name="LNGNAM")
    public String getLongName() {
        return longName;
    }
    /**
     * @param longName the longName to set
     */
    public void setLongName(String longName) {
        this.longName = longName;
    }
    /**
     * @return the shortName
     */
    @Column(name="SRTNAM")
    public String getShortName() {
        return shortName;
    }
    /**
     * @param shortName the shortName to set
     */
    public void setShortName(String shortName) {
        this.shortName = shortName;
    }
    /**
     * @return the address1
     */
    @Column(name="ADR1")
    public String getAddress1() {
        return address1;
    }
    /**
     * @param address1 the address1 to set
     */
    public void setAddress1(String address1) {
        this.address1 = address1;
    }
    /**
     * @return the address2
     */
    @Column(name="ADR2")
    public String getAddress2() {
        return address2;
    }
    /**
     * @param address2 the address2 to set
     */
    public void setAddress2(String address2) {
        this.address2 = address2;
    }
    /**
     * @return the city
     */
    @Column(name="CTY")
    public String getCity() {
        return city;
    }
    /**
     * @param city the city to set
     */
    public void setCity(String city) {
        this.city = city;
    }
    /**
     * @return the state
     */
    @Column(name="STA")
    public String getState() {
        return state;
    }
    /**
     * @param state the state to set
     */
    public void setState(String state) {
        this.state = state;
    }
    /**
     * @return the zipCode
     */
    @Column(name="PSTCOD")
    public String getZipCode() {
        return zipCode;
    }
    /**
     * @param zipCode the zipCode to set
     */
    public void setZipCode(String zipCode) {
        this.zipCode = zipCode;
    }
    /**
     * @return the returnAddress1
     */
    @Column(name="RTNADR1")
    public String getReturnAddress1() {
        return returnAddress1;
    }
    /**
     * @param returnAddress1 the returnAddress1 to set
     */
    public void setReturnAddress1(String returnAddress1) {
        this.returnAddress1 = returnAddress1;
    }
    /**
     * @return the returnAddress2
     */
    @Column(name="RTNADR2")
    public String getReturnAddress2() {
        return returnAddress2;
    }
    /**
     * @param returnAddress2 the returnAddress2 to set
     */
    public void setReturnAddress2(String returnAddress2) {
        this.returnAddress2 = returnAddress2;
    }
    /**
     * @return the returnCity
     */
    @Column(name="RTNCTY")
    public String getReturnCity() {
        return returnCity;
    }
    /**
     * @param returnCity the returnCity to set
     */
    public void setReturnCity(String returnCity) {
        this.returnCity = returnCity;
    }
    /**
     * @return the returnState
     */
    @Column(name="RTNSTA")
    public String getReturnState() {
        return returnState;
    }
    /**
     * @param returnState the returnState to set
     */
    public void setReturnState(String returnState) {
        this.returnState = returnState;
    }
    /**
     * @return the returnZipCode
     */
    @Column(name="RTNPSTCOD")
    public String getReturnZipCode() {
        return returnZipCode;
    }
    /**
     * @param returnZipCode the returnZipCode to set
     */
    public void setReturnZipCode(String returnZipCode) {
        this.returnZipCode = returnZipCode;
    }
    /**
     * @return the phoneNumber
     */
    @Column(name="PHNNUM")
    public int getPhoneNumber() {
        return phoneNumber;
    }
    /**
     * @param phoneNumber the phoneNumber to set
     */
    public void setPhoneNumber(int phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
    /**
     * @return the areaCode
     */
    @Column(name="ARACOD")
    public int getAreaCode() {
        return areaCode;
    }
    /**
     * @param areaCode the areaCode to set
     */
    public void setAreaCode(int areaCode) {
        this.areaCode = areaCode;
    }
    /**
     * @return the replacementCharge
     */
    @Column(name="RPLCHRFLG")
    @Type(type="yes_no")
    public boolean isReplacementCharge() {
        return replacementCharge;
    }
    /**
     * @param replacementCharge the replacementCharge to set
     */
    public void setReplacementCharge(boolean replacementCharge) {
        this.replacementCharge = replacementCharge;
    }
    /**
     * @return the replacementChargeAmount
     */
    @Column(name="RPLCHRAMT")
    public BigDecimal getReplacementChargeAmount() {
        return replacementChargeAmount;
    }
    /**
     * @param replacementChargeAmount the replacementChargeAmount to set
     */
    public void setReplacementChargeAmount(BigDecimal replacementChargeAmount) {
        this.replacementChargeAmount = replacementChargeAmount;
    }
    /**
     * @return the customerServiceKeycode
     */
    @Column(name="CUSSVCKEY")
    public String getCustomerServiceKeycode() {
        return customerServiceKeycode;
    }
    /**
     * @param customerServiceKeycode the customerServiceKeycode to set
     */
    public void setCustomerServiceKeycode(String customerServiceKeycode) {
        this.customerServiceKeycode = customerServiceKeycode;
    }
    /**
     * @return the restockPercent
     */
    @Column(name="RSKPCT")
    public BigDecimal getRestockPercent() {
        return restockPercent;
    }
    /**
     * @param restockPercent the restockPercent to set
     */
    public void setRestockPercent(BigDecimal restockPercent) {
        this.restockPercent = restockPercent;
    }
    /**
     * @return the enterpriseId
     */
    @Column(name="ETRID")
    public Integer getEnterpriseId() {
        return enterpriseId;
    }
    /**
     * @param enterpriseId the enterpriseId to set
     */
    public void setEnterpriseId(Integer enterpriseId) {
        this.enterpriseId = enterpriseId;
    }
    /**
     * @return the country
     */
    @Column(name="CRY")
    public String getCountry() {
        return country;
    }
    /**
     * @param country the country to set
     */
    public void setCountry(String country) {
        this.country = country;
    }
    /**
     * @return the returnCountry
     */
    @Column(name="RTNCRY")
    public String getReturnCountry() {
        return returnCountry;
    }
    /**
     * @param returnCountry the returnCountry to set
     */
    public void setReturnCountry(String returnCountry) {
        this.returnCountry = returnCountry;
    }
    /**
     * @return the phoneExtension
     */
    @Column(name="PHNEXT")
    public int getPhoneExtension() {
        return phoneExtension;
    }
    /**
     * @param phoneExtension the phoneExtension to set
     */
    public void setPhoneExtension(int phoneExtension) {
        this.phoneExtension = phoneExtension;
    }
    /**
     * @return the phoneType
     */
    @Column(name="PHNTYPCLF")
    public String getPhoneType() {
        return phoneType;
    }
    /**
     * @param phoneType the phoneType to set
     */
    public void setPhoneType(String phoneType) {
        this.phoneType = phoneType;
    }
    /**
     * @return the giftCardItemNumber
     */
    @Column(name="GFTCTFITM")
    public String getGiftCardItemNumber() {
        return giftCardItemNumber;
    }
    /**
     * @param giftCardItemNumber the giftCardItemNumber to set
     */
    public void setGiftCardItemNumber(String giftCardItemNumber) {
        this.giftCardItemNumber = giftCardItemNumber;
    }
    /**
     * @return the implementationStatus
     */
    @Column(name="IMPSTSFLG")
    @Type(type="yes_no")
    public boolean isImplementationStatus() {
        return implementationStatus;
    }
    /**
     * @param implementationStatus the implementationStatus to set
     */
    public void setImplementationStatus(boolean implementationStatus) {
        this.implementationStatus = implementationStatus;
    }
    /**
     * @return the defaultWebsiteId
     */
    @Column(name="DFTWEBID")
    public int getDefaultWebsiteId() {
        return defaultWebsiteId;
    }
    /**
     * @param defaultWebsiteId the defaultWebsiteId to set
     */
    public void setDefaultWebsiteId(int defaultWebsiteId) {
        this.defaultWebsiteId = defaultWebsiteId;
    }
    /**
     * @return the callTagFee
     */
    @Column(name="CTGFEEAMT")
    public BigDecimal getCallTagFee() {
        return callTagFee;
    }
    /**
     * @param callTagFee the callTagFee to set
     */
    public void setCallTagFee(BigDecimal callTagFee) {
        this.callTagFee = callTagFee;
    }
    /**
     * @return the warehouseRules
     */
    public WarehouseRules getWarehouseRules() {
        return warehouseRules;
    }
    /**
     * @param warehouseRules the warehouseRules to set
     */
    public void setWarehouseRules(WarehouseRules warehouseRules) {
        this.warehouseRules = warehouseRules;   
}

我的WarehouseRules类如下。

@Entity(name = "COBRLWHS")
public class WarehouseRules implements Serializable {
    private static final long serialVersionUID = 1967521668154976367L;

    @OneToOne(mappedBy="warehouseRules")
    private Company company;

    @Id
    @Column(name = "BUSUNTNBR")
    private Integer businessUnit;

    @Column(name="ORDPTYCLF")
    private String orderPriority;

    @Column(name="WHSPPRCLF")
    private String warehousePaperwork;

    @Column(name="ENTCUTTIM")
    private Time entryCutoffTime;

    @Column(name = "RRLADLDAY")
    private Integer ruralDays;

    @Column(name = "SRRADLDAY")
    private Integer superRuralDays;

    @Column(name = "BOADLDAY")
    private Integer backorderDays;

    @Column(name = "DFTFRTTBL")
    private String freightTable;

    public void setId(Integer id) {
        setBusinessUnit(id);
    }

    /**
     * @return the businessUnit
     */
    public Integer getBusinessUnit() {
        return businessUnit;
    }

    /**
     * @param businessUnit the businessUnit to set
     */
    public void setBusinessUnit(Integer businessUnit) {
        this.businessUnit = businessUnit;
    }

    /**
     * @return the ruralDays
     */
    public Integer getRuralDays() {
        return ruralDays;
    }

    /**
     * @param ruralDays the ruralDays to set
     */
    public void setRuralDays(Integer ruralDays) {
        this.ruralDays = ruralDays;
    }

    /**
     * @return the superRuralDays
     */
    public Integer getSuperRuralDays() {
        return superRuralDays;
    }

    /**
     * @param superRuralDays the superRuralDays to set
     */
    public void setSuperRuralDays(Integer superRuralDays) {
        this.superRuralDays = superRuralDays;
    }

    /**
     * @return the backorderDays
     */
    public Integer getBackorderDays() {
        return backorderDays;
    }

    /**
     * @param backorderDays the backorderDays to set
     */
    public void setBackorderDays(Integer backorderDays) {
        this.backorderDays = backorderDays;
    }

    /**
     * @return the freightTable
     */
    public String getFreightTable() {
        return freightTable;
    }

    /**
     * @param freightTable the freightTable to set
     */
    public void setFreightTable(String freightTable) {
        this.freightTable = freightTable;
    }   

    /**
     * @return the orderPriority
     */
    public String getOrderPriority() {
        return orderPriority;
    }

    /**
     * @param orderPriority the orderPriority to set
     */
    public void setOrderPriority(String orderPriority) {
        this.orderPriority = orderPriority;
    }

    /**
     * @return the warehousePaperwork
     */
    public String getWarehousePaperwork() {
        return warehousePaperwork;
    }

    /**
     * @param warehousePaperwork the warehousePaperwork to set
     */
    public void setWarehousePaperwork(String warehousePaperwork) {
        this.warehousePaperwork = warehousePaperwork;
    }

    /**
     * @return the entryCutoffTime
     */
    public Time getEntryCutoffTime() {
        return entryCutoffTime;
    }

    /**
     * @param entryCutoffTime the entryCutoffTime to set
     */
    public void setEntryCutoffTime(Time entryCutoffTime) {
        this.entryCutoffTime = entryCutoffTime;
    }



    /**
     * @return the company
     */
    public Company getCompany() {
        return company;
    }

    /**
     * @param company the company to set
     */
    public void setCompany(Company company) {
        this.company = company;
    }

    public int hashCode() {
        final int prime = 31;
        int result = super.hashCode();
        result = prime * result
                + ((businessUnit == null) ? 0 : businessUnit.hashCode());
        return result;
    }


    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (!super.equals(obj))
            return false;
        if (getClass() != obj.getClass())
            return false;
        WarehouseRules other = (WarehouseRules) obj;
        if (businessUnit == null) {
            if (other.businessUnit != null)
                return false;
        } else if (!businessUnit.equals(other.businessUnit))
            return false;
        return true;
    }
}

当我尝试运行我的代码时,我得到以下异常:

org.hibernate.AnnotationException: Referenced property not a (One|Many)ToOne: com.oriental.comet.db2.company.entity.Company.warehouseRules in mappedBy of com.oriental.comet.db2.company.entity.WarehouseRules.company:org.hibernate.AnnotationException:Referenced property not a (One|Many)ToOne: com.oriental.comet.db2.company.entity.Company.warehouseRules in mappedBy of com.oriental.comet.db2.company.entity.WarehouseRules.company
    at org.hibernate.cfg.OneToOneSecondPass.doSecondPass(OneToOneSecondPass.java:248)
    at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1697)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1426)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:857)

我能想到的唯一事实是两个表的ID都有相同的列名?我不能改变它,所以我不知道是否有解决方法(如果确实如此)或者我是否遗漏了某些东西。

2 个答案:

答案 0 :(得分:1)

在班级Company中,您已注释了一个FIELD(warehouseRules),但该班级中的所有其他人都使用了PROPERTY。您应该使用 PROPERTY FIELD而不是混合。也许如果你保持一致,你的JPA提供者会有意义吗?

显然,消息可能更清晰,强调您没有注释PROPERTY(吸气剂)。其他JPA提供者不一定坚持使用OneToOne / OneToMany注释,因为从属性/字段类型可以清楚地看出它是一种关系。

答案 1 :(得分:0)

我为您提供了一个简单的例子: 人与地址有一对一的关系 为此,我使用共享主键关联
人员类:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "person_pk", nullable = false)
private Long personPk;

@OneToOne(cascade = {CascadeType.MERGE, CascadeType.PERSIST})
@PrimaryKeyJoinColumn
private Address address;

地址类:

@Id
@GeneratedValue(generator = "myForeignGenerator")
@GenericGenerator(name = "myForeignGenerator", 
                    strategy = "foreign", 
                    parameters = @Parameter(name = "property", value = "person"))
@Column(name = "address_pk")
private Long addressPk;

@OneToOne(targetEntity = Person.class)
@PrimaryKeyJoinColumn
private Person person;

要保留瞬态对象:

Person person = new Person();
Address address = new Address();
person.setAddress(address);
address.setPerson(person);

persist(person);

这就是数据库架构的样子:
人员表

person_pk <<PK>>

地址表

address_pk <<PK>><<FK>>

阅读如下:当保存地址时,主键值取自 person 属性。 person 属性是对 Person 对象的引用;因此,插入的主键值与该实例的主键值相同。