Исключение полей из @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 должно быть достаточно.