giovedì 23 febbraio 2012

Strategie mappature PK con gli EJB 3.0

Ogni entity bean deve essere identificato univicamente.
Sono possibili 3 strategie:

  • Usando l'annotation @Id;
  • Usando l'annotation @IdClass;
  • Usando l'annotation @EmbeddedId.
@Id

Questa annotation è applicata al campo che mappa la primary key nel database, quando nel database la chiave primaria è composta da un singolo campo.
I campi supportati sono campi primitivi, e oggetti che implementano Serializable come java.lang.String java.util.Date e java.sql.Date.
Non è raccomandato utilizzare campi di tipo float o double, per via di possibili arrotondamenti e imprecisioni

@IdClass

Nel caso di composite key sul db si crea una classe con le chiavi e in questa classe si effettua l'override dei due metodi di object equals e hashCode.

Quindi nell'entity bean si utilizza a livello di classe l'annotation @IdClass facendo riferimento alla classe appena creata e quindi sui singoli campi che fanno parte dell'id si utilizza l'annotation @Id.

Esempio:

Supponiamo di avere una classe Persona con chiave composta formata dall'accoppiata cognome e nome + altri campi.

Definiamo quindi l'IdClass

public class ChiavePersona implements Serializable
{
    String nome;
    String cognome;
   public ChiavePersona(){}
   public boolean equals(Object other) {
   if(other instanceof ChiavePersona){
   final ChiavePersona otherPK=(ChiavePersona)other;
   return (other.name.equals(this.nome) && other.cognome.equals(this.cognome));

   }
   }
   public int hashCode(){
    return super.hashCode();
    }
 
}

L' entity è definita così:

@Entity
@IdClass(ChiavePersona.class)
public class Persona{
 @Id
  protected String nome;
 @Id
  protected String cognome;

   ......
}



@EmbeddedId

In questo caso si crea come nel caso precedente la classe con la primary key ma annotandola con @Embeddable e quindi referenziando poi la classe stessa con l'annotation @EmbeddedId
Nell'Entity quindi

@Entity
public class Persona{
 public Persona(){}
 @EmbeddedId
 protected ChiavePersona personaId;
}
.....

}


Nessun commento:

Posta un commento