Исключение полей из @Embedded properties в каждом конкретном случае с помощью Hibernate/JPA

я переношу некоторые классы в Hibernate hbm.xml-файл в аннотации JPA.

у нас есть встраиваемый класс Address используется в нескольких местах. Каждое место использует другое подмножество свойств в Address.

(геттеры/сеттеры опущены для краткости)

@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 в использует адресу.страна, но billingAddress не делает; и ни один из них не использует адрес.электронная почта.

проблема что гибернация вывод @Column теги для любого столбца, где я бы явно не предоставил.

Я пробовал добавлять @Transient для всех Address поля, но кажется, что @AttributeOverride не козырь @Transient.

есть ли обходной путь для этого?

2 ответов


Я не думаю, что с аннотациями можно "игнорировать" поле из адреса во встроенных объектах.

обходным путем является создание адреса базового типа без электронной почты и ExtendedAddress (подкласс адреса) с полем email.


моим советом было бы создать новую сущность под названием PartialAddress/NationalAddress / BillingAddress. Это будет использоваться только для сопоставления JPA и не будет отображаться в интерфейсе клиента:

private PartialAddress billingAddress;

public Address getBillingAddress() {
    return billingAddress.toAddress();
}

в противном случае, я придумал несколько уродливый обходной путь для этой проблемы, возможно, он будет работать и для вас. Вместо сопоставления поля с реальным столбцом я возвращаю пустую константу SQL:

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

Я использую Oracle и EclipseLink, работает на Hibernate 3.6 как что ж. И я тестировал его только на объектах, доступных только для чтения. Хотя, теоретически, установка insertable и updatable атрибутов false должно быть достаточно.