Исключение полей из @Embedded свойств на индивидуальной основе с Hibernate / JPA - PullRequest
14 голосов
/ 10 августа 2011

Я перенесу некоторые классы из файла 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 использует Address.country, но billingAddressне;и ни один из них не использует Address.email.

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

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

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

Ответы [ 2 ]

7 голосов
/ 22 марта 2013

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

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.

7 голосов
/ 20 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...