2011-10-05 14 views

Respuesta

14

¿Cómo afecta la anotación incrustada a la base de datos?

No lo afecta en absoluto. En la capa del proveedor de ORM, todos los campos de la entidad incrustada son combinados con la entidad principal y se tratan de la misma manera que si se declararan allí todo el tiempo. En otras palabras, funciona como si literalmente copiara todos los campos, getters y setters en la entidad que contiene el objeto incrustado.

¿Cómo deben cambiar las consultas de SQL?

They will not. No necesitas cambiar nada Véase más arriba.

¿Cuál es el caso típico de uso de la anotación de anotación?

A veces tiene una gran tabla con varias columnas (especialmente con las bases de datos heredadas). Sin embargo, algunas columnas están vinculadas lógicamente entre sí (como calle, ciudad y número de teléfono en la tabla CUSTOMER). Cuando no desea crear un objeto con todos los campos, crea un objeto incrustado Address. De esta manera, lógicamente agrupa columnas de direcciones en un objeto en lugar de tener un POJO igualmente grande con una lista plana de campos.

El uso de objetos incrustados se considera una buena práctica, especialmente cuando se descubre una fuerte relación 1-1.

+0

Bueno, espera. '@ Embedded' no afectará la base de datos si está reemplazando un grupo de campos en una entidad con un objeto incrustado. Pero si está cambiando una clase de '@ Entity' a' @ Embedded', ¡eso tendrá un efecto bastante grande! –

+0

* @ TomAnderson *: tienes razón. De hecho, esto es lo que quise decir cuando considero '@ Embedded' si se tiene en cuenta una relación fuerte 1-1: cualquiera use' @ Entity' separada o * merge * it con la entidad padre, pero manténgala en una clase '@ Embedded' por separado. –

2

extiende la respuesta de @Tomasz Nurkiewicz objetos incrustados son útiles para el mapeo de una mesa de ayuda con un compuesto de la pizca de la clave principal de la anotación @EmbenddedId

1

¿Cuál es el caso de uso típico para el uso de la anotación?

Esto es típicamente para representar una clave principal compuesta como una clase integrable:

@Entity 
public class Project { 
    @EmbeddedId ProjectId id; 
    : 
} 



@Embeddable 
Class ProjectId { 
    int departmentId; 
    long projectId; 
} 

Los campos de clave principal se definen en una clase de enrasado. La entidad contiene un solo campo de clave principal anotado con @EmbeddedId y contiene una instancia de esa clase incrustable. Al utilizar este formulario, no se define una clase de ID separada porque la clase incorporable en sí misma puede representar valores completos de clave primaria.

¿Cómo afecta la anotación incrustada a la base de datos?

No lo es. Use esta anotación para representar una clave primaria compuesta.

¿Cómo deben cambiar las consultas de SQL?

They will not.

1

Al igual que Tomasz dijo: ese es el único objetivo, el otro: puedes "capturar" el estado de otra entidad relacionada dentro de tu mesa. F.e.

@Embeddable public class Company { 
    String name; 
    String streetName; 
    String city; 
} 



@Entity public class Invoice { 

    @Embedded 
    @AttributeOverrides({ 
     @AttributeOverride(name="name", [email protected](name="name")), 
     @AttributeOverride(name="streetName", [email protected](name="streetName")), 
     @AttributeOverride(name="city", [email protected](name="city")), 
    })    
    Company seller; 

    @Embedded 
    @AttributeOverrides({ 
     @AttributeOverride(name="name", [email protected](name="name")), 
     @AttributeOverride(name="streetName", [email protected](name="streetName")), 
     @AttributeOverride(name="city", [email protected](name="city")), 
    })   
    Company customer; 
} 

en este ejemplo - sin incrustados y @AttributeOverrides cualquier cambio en el futuro de la empresa del cliente cambiarán los datos de la factura - lo cual es un error - la factura se genera para la empresa con los datos antiguos.

Es bueno explicado aquí: :) Java - JPA @Basic and @Embedded annotations

Cuestiones relacionadas