我正在尝试使用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都有相同的列名?我不能改变它,所以我不知道是否有解决方法(如果确实如此)或者我是否遗漏了某些东西。
答案 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 对象的引用;因此,插入的主键值与该实例的主键值相同。