qua*_*ial 15 java annotations hibernate jpa
我正在将Hibernate hbm.xml文件中的某些类迁移到JPA注释.
我们有一个可嵌入的类Address,可以在几个地方使用.每个地方在地址中使用不同的属性子集.
(为简洁省略了getter/setters)
@Embeddable
public class Address {
String email;
String address;
String city;
String state;
String zip;
String country;
}
@Entity
@Table(name="customer")
public class Customer {
@Embedded
@AttributeOverrides({
@AttributeOverride(name="address", column=@Column(name="ship_addr"),
@AttributeOverride(name="city", column=@Column(name="ship_city"),
@AttributeOverride(name="state", column=@Column(name="ship_state"),
@AttributeOverride(name="zip", column=@Column(name="ship_zip"),
@AttributeOverride(name="country", column=@Column(name="ship_country")
})
Address shippingAddress;
@Embedded
@AttributeOverrides({
@AttributeOverride(name="address", column=@Column(name="bill_addr"),
@AttributeOverride(name="city", column=@Column(name="bill_city"),
@AttributeOverride(name="state", column=@Column(name="bill_state"),
@AttributeOverride(name="zip", column=@Column(name="bill_zip")
})
Address billingAddress;
}
Run Code Online (Sandbox Code Playgroud)
请注意,在这个设计的示例中,shippingAddress使用Address.country,但billingAddress不使用; 他们都没有使用Address.email.
问题是Hibernate推测@Column任何我没有明确提供过的列的标签.
我尝试添加@Transient到所有Address字段,但似乎@AttributeOverride不是特朗普@Transient.
这有什么解决方法吗?
我的建议是创建一个名为PartialAddress/NationalAddress/BillingAddress的新实体.这将仅用于JPA映射,而不会在Customer接口上公开:
private PartialAddress billingAddress;
public Address getBillingAddress() {
return billingAddress.toAddress();
}
Run Code Online (Sandbox Code Playgroud)
否则,我已经为这个问题提出了一个有点丑陋的解决方法,也许它对你也有用.我没有将字段映射到实际列,而是返回一个SQL null常量:
@Embedded
@AttributeOverrides({
@AttributeOverride(name="address", column=@Column(name="bill_addr"),
@AttributeOverride(name="city", column=@Column(name="bill_city"),
@AttributeOverride(name="state", column=@Column(name="bill_state"),
@AttributeOverride(name="zip", column=@Column(name="bill_zip"),
@AttributeOverride(name="country", column=@Column(name="bill_id + null"),
})
Address billingAddress;
Run Code Online (Sandbox Code Playgroud)
我正在使用Oracle和EclipseLink,也适用于Hibernate 3.6.我只在只读对象上测试过它.虽然,从理论上说,设置insertable和updatable属性设置为false应该够了.
| 归档时间: |
|
| 查看次数: |
8186 次 |
| 最近记录: |