2012-07-26 19 views
5

ho seguente definizione nella classe EmployeeJPA: Override Auto generato ID

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "employee_id") 
private Integer employeeId; 

Ora voglio importare dipendenti esistenti con gli ID dei dipendenti esistenti. Anche se imposto l'ID dipendente prima del salvataggio, l'ID assegnato viene ignorato e l'ID auto incrementato viene memorizzato. Come ignoriamo questo?

+0

Ovviamente alcune implementazioni JPA (ad es. DataNucleus JPA) possono fornire un meccanismo per consentire l'auto-generazione solo quando quel campo è nullo, ma JPA come una specifica no. – DataNucleus

risposta

2

Ho trovato una discussione duplicata con lo stesso problema. bypass generatedvalue in hibernate

Così finalmente ho scritto il mio generatore per risolvere il problema.

Grazie a tutti per l'aiuto :)

1

Non è possibile sovrascriverlo. Innanzitutto, JPA non fornisce il modo di farlo. Il secondo problema è che GenerationType.AUTO può produrre un tipo di colonna che non accetterà il valore assegnato dall'utente tramite l'istruzione SQL.

Eseguire l'importazione manuale dei dati e non provare a utilizzare l'applicazione stessa come strumento di importazione.

+0

:(Qualunque altro modo di importazione manuale? Non posso farlo manualmente in quanto vi è un po 'di pre-elaborazione. In tal caso devo scrivere il codice inserto :( – sidgate

+0

@sidgate Forse potresti semplicemente disabilitare la generazione automatica, fare la tua importazione, e riattivarlo? –

+0

Questo può essere possibile, ma dipende dalla definizione della colonna (o da come GenerationType.AUTO è effettivamente formattato nel database) di id è semplice disabilitazione/abilitazione possibile. –

0

In questo caso, potrebbe essere meglio avere un @MappedSuperclass

@MappedSuperclass 
public AbstractEmployee { 
    // declare all properties, getters, setters except for the id 
} 

@Entity 
@Table(name="EMPLOYEE") 
public class Employee extends AbstractEmployee { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "employee_id") 
    private Integer employeeId; 

    ... 
} 

@Entity 
@Table(name="EMPLOYEE") 
public class EmployeeWithAssignedId extends AbstractEmployee { 
    @Id 
    @Column(name = "employee_id") 
    private Integer employeeId; 

    ... 
} 

Quindi, quando si desidera assegnare l'ID manualmente, utilizzare la seconda classe. Non ho provato questo, ma credo che dovrebbe funzionare per la tua situazione. Non credo ci sia alcuna regola in JPA che dice che due classi non possono avere lo stesso nome di tabella :)

+0

Ho avuto le mie classi modello generate da Roo. Modificare queste classi sarebbe stato complicato, invece ho implementato un nuovo generatore, spiegato sotto – sidgate

+0

OK. menziona queste cose nelle tue domande, dato che sono informazioni importanti che potrebbero alterare le risposte delle persone. – Matt

0

è necessario eseguire l'override getEmployeeId() e utilizzare annotazione su questo metodo in questo caso JPA utilizza i metodi getter per tutti i campi di classe ed è necessario spostare altri Annotaions sul getter metodi

Problemi correlati