一尘不染

使用Hibernate / JPA逐案排除@Embedded属性中的字段

hibernate

我正在将Hibernate hbm.xml文件中的某些类迁移到JPA批注。

我们有一个Address在多个地方使用的可嵌入类。每个位置使用地址中属性的不同子集。

(为简便起见,省略了getter / setter)

@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;
}

请注意,在这个人为的示例中,shippingAddress使用Address.country,但billingAddress不使用;他们都不使用Address.email。

问题在于,Hibernate会@Column为我未明确提供的任何列推断标签。

我尝试将其添加@Transient到所有Address字段中,但似乎@AttributeOverride没有胜过@Transient

有什么解决方法吗?


阅读 422

收藏
2020-06-20

共1个答案

一尘不染

我认为无法通过注释“忽略”嵌入式对象中地址中的字段。

一种解决方法是创建不带电子邮件的基本类型地址,并使用字段电子邮件创建ExtendedAddress(地址的子类)。

2020-06-20