objetos example embebidos ejemplos ejemplo java hibernate jpa annotations

example - jpa java ejemplo



Excluir campos de las propiedades @Embedded caso por caso con Hibernate/JPA (2)

Mi consejo sería crear una nueva entidad llamada dirección parcial / dirección nacional / dirección de facturación. Esto se usaría solo para el mapeo JPA y no se expondría en la interfaz del Cliente:

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

De lo contrario, he encontrado una solución algo fea para este problema, tal vez te funcione también. En lugar de asignar el campo a una columna real, devuelvo una constante SQL nula:

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

Estoy usando Oracle y EclipseLink, también funciona en Hibernate 3.6. Y solo lo he probado en objetos de solo lectura. Aunque, teóricamente, establecer los atributos insertable y updatable en falso debería ser suficiente.

Estoy migrando algunas clases en un archivo Hibernate hbm.xml a las anotaciones JPA.

Tenemos una Address clase incrustable que se usa en varios lugares. Cada lugar usa un subconjunto diferente de las propiedades en Dirección.

(getters / setters omitidos por brevedad)

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

Tenga en cuenta que en este ejemplo artificial, shippingAddress usa Address.country, pero billingAddress no lo hace; y ninguno de ellos usa Address.email.

El problema es que Hibernate está infiriendo etiquetas @Column para cualquier columna en la que no haya proporcionado explícitamente una.

Intenté agregar @Transient a todos los campos de Address , pero parece que @AttributeOverride no @AttributeOverride @Transient .

¿Hay alguna solución para esto?


No creo que sea posible con las anotaciones "ignorar" un campo de la dirección en sus objetos incrustados.

Una solución alternativa es crear un tipo de base Dirección sin correo electrónico y una Dirección Extendida (subclase de Dirección) con el campo de correo electrónico.