domenica 23 settembre 2012

Jpa mappare Primary Key

La primary key è l'identità di un entity bean.
L'annotazione  @javax.persistence.Id identifica la proprietà che funge da primarìy key.
La chiave primaria può essere autogenerata dal provider, in questo caso si utilizza l'annotazione
@javax.persistence.GeneratedValue con le seguenti strategie (attributo strategy):
  • TABLE;
  • SEQUENCE;
  • IDENTITY;
  • AUTO.
AUTO

E'  la strategia di default  che utilizza le colonne autoincrementali presenti in molti database come MySql o Sql Server.

IDENTITY

Con questa strategia si obbliga il provider ad utilizzare i campi autoincrementali del db (esempio in mysql AUTO_INCREMENT e in Sql Server IDENTITY ) Per adottare questa strategia basta fare così:
....
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public long getId(){
.....
}

TABLE

Con questa strategia si definisce una tabella utilizzata come "serbatoio" per fornire le chiavi primarie.
La struttura di questa tabella è la seguente:

create table GENERATOR_TABLE
{
     PRIMARY_KEY_COLUMN VARCHAR not null,
     VALUE_COLUMN long not null
}

Bisogna utilizzare una altra annotazione @TableGenerator dove si specifica il generatore con il nome della tabella creata etc etc.

Esempio

@TableGenerator(name="myGenerator",table="GENERATOR_TABLE",pkColumnName="PRIMARY_KEY_COLUMN",
valueColumnName="VALUE_COLUMN",pkColumnValue="CUST_ID",allocationsize=10)
@Id
@GeneratedValue(strategy=GenerationType.TABLE,generator="myGenerator")
public long getId(){...}

SEQUENCE

Alcuni RDBMS come Oracle hanno un meccanismo built in per la generazione delle primary key, definito appunto SEQUENCE.
In questi casi a livello di classe va definito il sequence generator utilizzato e referenziato dall'attributo generator dell'annotazione @GeneratedValue.
Esempio:

@Entity
@Table(name="CUSTOMER_TABLE")
@SequenceGenerator(name="CUSTOMER_SEQUENCE",sequenceName="CUST_SEQ")
public class Customer implements Serializable{

.....
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="CUSTOMER_SEQUENCE")
public long getId(){...}
....
}

Nessun commento:

Posta un commento