2013-05-15 12 views
7

Ho 2 tabelle cliente e cronistoria clienti. customhistory ha customerId di chiave estera che fa riferimento al customerId del cliente. Nell'entità generata da JPA ho un oggetto cliente in classe customerhistory mentre io voglio salvare solo customerId nella tabella consumerhistorycome salvare entità chiave esterna in JPA

Sto ricevendo l'ID cliente corretto ma quando voglio salvare l'attributo customerId ho solo il oggetto del cliente con me, ma non customerId in autogenerated classe di entità di consumerhistory

@Entity 
public class Customerhistory implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int primarykeyId; 

    //bi-directional many-to-one association to Customer 
    @ManyToOne 
    @JoinColumn(name="CustomerId") 
    private Customer customer; 

come indicato sopra io non sono customerId con me in un'entità customerHistory. come salvarlo?

risposta

17

Utilizzare la chiamata getReference di entityManager per caricare l'oggetto cliente utilizzando l'id e quindi impostarlo nella cronologia cliente. Nella maggior parte dei casi questa chiamata restituirebbe un proxy con solo l'ID incorporato, gli attributi del cliente non verranno caricati a meno che non venga richiamato un altro metodo del cliente.

Customer customer = entityManager.getReference(Customer.class, cutomerId); 

CustomerHistory newCustomerHistory = new CustomerHistory(); 
newCustomerHistory.setCustomer(customer); 
entityManager.persist(newCustomerHistory); 
+0

Posso fare questo in un unico transazione? – Ced

+0

Sì, puoi farlo in una singola Transazione. – Ced

2

L'associazione tra i tuoi tavoli è gestita da JPA che non devi accedere al cliente in customerHistory. Dovresti usare customer.getHistory() (o qualsiasi altra cosa tu lo abbia chiamato) per manipolare le voci della cronologia associate. L'integrità referenziale sarà gestita dall'APP.

0

Se si utilizza EclipseLink come provider JPA c'è un'annotazione che viene implementato per aggiornare l'attributo associato, impostare prima della classe come segue:

@Cache(alwaysRefresh = true, disableHits = true) 
public class TheMainEntity { 
    ... 
    ... 
    ... 
    ... 
}   
Problemi correlati