2010-04-05 13 views
26

Sto imparando JPA da this tutorial.Java - annotazioni JPA @Basic e @Embedded

mi hanno alcune confusioni nella comprensione dei seguenti annotazioni:

  • @Basic
  • @Embedded

campi di un tipo predefinito embeddable a persistenti, come se annotata con @Embedded.

Se i campi di embeddable tipi di default persistente, allora perché abbiamo bisogno del @Embedded annotazione

risposta

43

Il @Embeddable di annotazione consente di specificare una classe le cui istanze sono memorizzati come parte intrinseca del soggetto possessore. Questa annotazione ha senza attributi.

@Embeddable 
public class EmploymentPeriod { 
    java.util.Date startDate; 
    java.util.Date endDate; 
    ... 
} 

Il @Embedded annotazione viene utilizzato per specificare un campo persistente o di proprietà di un ente il cui valore è un'istanza di una classe integrabile. Per impostazione predefinita, le definizioni delle colonne specificati nella classe @Embeddable applicano al tavolo della all'entità proprietaria ma si possono ignorare le utilizzando @AttributeOverride:

@Embedded 
@AttributeOverrides({ 
    @AttributeOverride(name="startDate", [email protected](name="EMP_START")), 
    @AttributeOverride(name="endDate", [email protected](name="EMP_END")) 
}) 
public EmploymentPeriod getEmploymentPeriod() { ... } 

Per quanto riguarda la @Basic annotazioni opzionale, è possibile utilizzare per configurare il tipo di recupero su LAZY e per configurare il mapping per non consentire valori null (per tipi non primitivi) con l'attributo optional.

@Basic(fetch=LAZY) 
protected String getName() { return name; } 

È inoltre possibile posizionarlo su un campo o proprietà per contrassegnarlo esplicitamente come permanente (a scopo di documentazione).

+3

Q1. Se i campi o le proprietà dei tipi incorporabili sono persistenti defualt, allora perché dobbiamo aggiungere l'annotazione '@ Embedded'? Q2. Posso usare l'annotazione '@ AttributeOverrides' senza l'annotazione' @ Embedded'? Potresti per favore gettare un po 'di luce su '@ Basic'? –

+2

Q1. Perché @ Embedded consente di ignorare le definizioni di colonna Q2. No, non la penso così C'è un buon esempio che illustra questo qui: http://www.redhat.com/docs/en-US/JBoss_Enterprise_Web_Platform/5.0.0/html/Hibernate_Annotations_Reference_Guide/ch02s02s02s03.html –

+2

@Pascal Cosa succede se non ci sono sostituzioni? Qual è lo scopo di '@ Embedded'? Può essere lasciato fuori? –

11

Nella mappatura ORM, la granularità del modello di oggetto può essere più fine di quella del database.

Ad esempio, si può avere un record Person nel database che può essere ulteriormente scomposto per contenere un riferimento a un oggetto Address nel modello. È qui che arrivano le annotazioni @Embedded e @Embeddable. Esse indicano semplicemente una relazione in cui uno Entity può essere memorizzato come parte di un altro.

Come per l'annotazione @Basic, è la forma più semplice di mappatura che viene applicata di default ai tipi primitivi come int e float, i loro wrapper e le enumerazioni.Maggiori informazioni si possono avere qui: http://docs.jboss.org/hibernate/stable/annotations/reference/en/html/entity.html#entity-mapping-property

2

@Basic

L'annotazione di base può essere applicato a una variabile di proprietà persistente o istanza di uno dei seguenti tipi:

Java primitiva types, wrapper dei tipi primitivi, String, java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time, java .sql.Tim estamp, byte [], Byte [], char [], Carattere [], enumerazione e qualsiasi altro tipo che implementa java.io.Serializable.

L'uso dell'annotazione di base è facoltativo per i campi persistenti e le proprietà di questi tipi. Se l'annotazione di base non è specificata per tale campo o proprietà, verranno applicati i valori di default dell'annotazione di base.

Esempio:

@Basic 
protected String name; 

e

@Basic(fetch=LAZY) 
protected String getName() { 
    return name; 
} 

@Embedded

Specifica un campo persistente o pr operatore di un'entità il cui valore è un'istanza di una classe incorporabile. La classe incorporabile deve essere annotata come Embeddable.

Esempio 1:

@Embedded  
@AttributeOverrides({ 
     @AttributeOverride(name="startDate", [email protected]("EMP_START")), 
     @AttributeOverride(name="endDate", [email protected]("EMP_END"))  
})   
public EmploymentPeriod getEmploymentPeriod() { ... } 

Esempio 2:

@Entity 
public class Project { 
    @EmbeddedId ProjectId id; 
    //other fields 
} 


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

JSR Persistence Specification e Source reference