2013-05-15 16 views
7

Mam 2 tabele klientów i customerhistory. customhistory ma klucz obcy customerId, który odwołuje się do customerId klienta. W encji generowanej przez JPA mam obiekt klienta w klasie customerhistory, a chcę zapisać tylko customerId w tabeli consumerhistoryjak zapisać klucz obcy w JPA

Otrzymuję prawidłowy identyfikator customerId, ale gdy chcę zapisać atrybut customerId, mam tylko przedmiotem klienta ze mną, ale nie customerId w wygenerowany automatycznie klasie podmiotowej 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; 

Jak pokazano powyżej nie mam customerId ze mną w jednostki customerHistory. jak to zapisać?

Odpowiedz

17

Użyj wywołania getReference elementu entityManager, aby wczytać obiekt klienta za pomocą identyfikatora, a następnie ustawić go w historii klienta. W większości przypadków to wywołanie zwróci serwer proxy z samym identyfikatorem, atrybuty klienta nie zostaną załadowane, dopóki nie zostanie wywołana inna metoda klienta.

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

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

Mogę to zrobić w jeden transakcja ? – Ced

+0

Tak, możesz to zrobić w pojedynczej Transakcji. – Ced

2

Powiązanie między twoimi tabelami jest zarządzane przez JPA, nie masz dostępu do customerId w customerHistory. Powinieneś użyć customer.getHistory() (lub jakkolwiek to nazwałeś) do manipulowania powiązanymi wpisami historii. Integralną integralność będzie zarządzane przez WZP.

0

Jeśli używasz EclipseLink jako dostawca JPA jest adnotacja, że ​​jest realizowany w celu odświeżenia powiązanych atrybut, należy ustawić go przed klasą, co następuje:

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