2012-09-28 11 views
5

Sto cercando di familiarizzare meglio con JPA, così ho creato un progetto molto semplice. Ho una classe utente e una classe indirizzo. Sembra che devo persistere entrambi anche se sto aggiungendo Address alla mia classe User?Perché devo mantenere entrambi gli oggetti se Indirizzo è annidato in Utente?

utente:

import javax.persistence.*; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Set; 

@Entity 
@Table(name = "usr") // @Table is optional, but "user" is a keyword in many SQL variants 
@NamedQuery(name = "User.findByName", query = "select u from User u where u.name = :name") 
public class User { 
    @Id // @Id indicates that this it a unique primary key 
    @GeneratedValue // @GeneratedValue indicates that value is automatically generated by the server 
    private Long id; 

    @Column(length = 32, unique = true) 
    // the optional @Column allows us makes sure that the name is limited to a suitable size and is unique 
    private String name; 

    // note that no setter for ID is provided, Hibernate will generate the ID for us 

    @OneToMany(fetch=FetchType.LAZY, mappedBy="user") 
    private List<Address> addresses; 

Indirizzo:

@Entity 
public class Address { 

    @Id // @Id indicates that this it a unique primary key 
    @GeneratedValue // @GeneratedValue indicates that value is automatically generated by the server 
    private Long id; 

    @Column(length=50) 
    private String address1; 

    @ManyToOne 
    @JoinColumn(name="user_id") 
    private User user; 

EntityManager:

EntityManager entityManager = Persistence.createEntityManagerFactory("tutorialPU").createEntityManager(); 

entityManager.getTransaction().begin(); 

User user = new User(); 
user.setName("User"); 

List<Address> addresses = new ArrayList<Address>(); 
Address address = new Address(); 
address.setAddress1("Address1"); 

addresses.add(address); 
user.setAddresses(addresses); 
entityManager.persist(user); 
entityManager.persist(address); 
entityManager.getTransaction().commit(); 
entityManager.close(); 

probabilmente facendo qualcosa di sbagliato ... semplicemente non sono sicuro di cosa si tratta?

Qualsiasi suggerimento sarebbe apprezzato.

Grazie,

S

+2

http://docs.oracle.com/javaee/6/api/javax/persistence/OneToMany.html#cascade(). Per impostazione predefinita, non è in cascata, in più è anche opzionale. –

risposta

10

Prova l'elemento cascade per l'annotazione.

@OneToMany(fetch=FetchType.LAZY, mappedBy="user", cascade=CascadeType.PERSIST) 
private List<Address> addresses; 

Il documentation dice che per default nessuna operazione viene in cascata. Dichiara inoltre che l'operazione in cascata è facoltativa, quindi dipende in realtà dall'implementazione che si sta utilizzando.

Inoltre, durante l'impostazione della relazione, assicurarsi di impostare entrambi i lati della relazione. Imposta indirizzi per utente e utente agli indirizzi.

0

Si sta utilizzando un'annotazione oneToMany. Da quanto ho capito, devi mantenere la classe genitore (l'utente) quando vuoi aggiungere una classe figlia (indirizzo) ad essa.

Persistendo la classe Utente, si fa sapere a JPA quale riga aggiornare.

5

Quello di cui parli si chiama Cascading. Ciò significa eseguire la stessa azione per oggetti nidificati, come ad esempio Address nel tuo User. Per impostazione predefinita, non vi è alcun collegamento a cascata se non si specifica alcun CascadeType.

È possibile definire vari tipi cascata in una volta

@OneToMany(fetch=FetchType.LAZY, mappedBy="user", cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) 
private List<Address> addresses; 

o semplicemente dire APP a cascata ogni operazione:

@OneToMany(fetch=FetchType.LAZY, mappedBy="user", cascade = CascadeType.ALL) 
private List<Address> addresses; 

Entrambi i modi si tradurrà in, per esempio, un persistito Address mentre persiste un User o la cancellazione dello Address associato quando viene rimosso uno User.

Ma! ... se si rimuove CascadeType.REMOVE dal primo esempio, la rimozione di un User non rimuoverà il suo associato Address (L'operazione di rimozione non sarà applicata a oggetti nidificati).

Problemi correlati