2015-08-10 11 views
13

Ho una semplice associazione tra 2 soggetti:Hibernate persiste entità senza recuperare l'oggetto di associazione. solo da id

public class Car { 

    ... 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "user_id") 
    private User user; 

    ... 

} 

e

public class User { 

    @Id 
    @GeneratedValue 
    @Column(name = "user_id") 
    private long userId; 

    ... 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user") 
    private Set<Car> cars; 

    ... 

} 

Poi ho un po 'id utente dal client. Ad esempio, userId == 5;
Per salvare auto con l'utente che ho bisogno di fare dopo:

User user = ... .findOne(userId); 
Car car = new Car(); 
car.setUser(user); 
... .save(car); 

La mia domanda è:
Posso persistere record di auto senza recupero utente?

Allo stesso modo, come avrei fatto utilizzando query SQL nativo: basta inserire userId come stringa (lunga) nella tabella Car.

Con la seconda cache lvl sarà più veloce ma a mio parere non ho bisogno di fare movimenti extra.

Il motivo principale per cui non desidero utilizzare la query nativa è perché ho associazioni molto più difficili nel mio progetto e ho bisogno di .save (auto) più volte. Inoltre, non voglio controllare manualmente l'ordine delle esecuzioni di query.

Se utilizzo session.createSQLQuery ("insert into ..... values ​​()"), l'inserimento batch di Hibernate funziona correttamente?



Correggimi se ho torto.

Grazie in anticipo!

UPDATE:

In realtà la mappatura è simile a:

C'è @ManyToMany associazione tra utente e auto. Ma il cross table è anche un'entità che viene chiamata, ad esempio, Passanger. Quindi la mappatura è prossimo:

public class User{ 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user", targetEntity = Passenger.class) 
    private Set<Passenger> passengers; 
} 

entità Croce

@IdClass(value = PassengerPK.class) 
public class Passenger { 

    @Id 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "user_id") 
    private User user; 

    @Id 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "car_id") 
    private Car car; 

    ... other fields ... 

} 

entità Auto:

public class Car { 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "car", targetEntity = Passenger.class, cascade = CascadeType.ALL) 
    private Set<Passenger> passengers; 
} 

E il codice:

List<User> users = ... .findInUserIds(userIds); // find user records where userId is IN userIds - collection with user Ids 
Car car = new Car();  //initialization of car's fields is omitted 
if (users != null) { 
    car.setPassengers(new HashSet<>(users.size())); 
    users.forEach((user) -> car.getPassengers().add(new Passenger(user, car))); 
} 
... .save(car); 
+0

Hai mostrato i mapping esatti? Non ci sono cascate da 'Car' a' User'? –

+0

@DraganBozanovic, ho aggiornato il post. E sì, ci sono cascate. – InsFi

risposta

12

"Posso mantenere la registrazione dell'auto senza recuperare l'utente?"

Sì, questo è uno dei lati buoni di proxy Hibernate:

User user = entityManager.getReference(User.class, userId); // session.load() for native Session API 
Car car = new Car(); 
car.setUser(user); 

Il punto chiave qui è quello di utilizzare EntityManager.getReference:

ottenere un'istanza, il cui stato può essere pigramente inverosimile.

Hibernate creerà semplicemente il proxy in base all'ID fornito, senza recuperare l'entità dal database.

"Se utilizzo session.createSQLQuery (" insert in ..... values ​​() "), l'inserimento batch di Hibernate funziona correttamente?"

No, non lo farà. Le query vengono eseguite immediatamente.

+0

Hai ragione. Ma ho un'altra domanda se permetti. Non riesco a chiamare .merge (auto) a causa dell'eccezione: l'entità separata passata a persistere? Non è un'opzione per chiamare saveOrUpdate() perché ho bisogno di removeOrphan. – InsFi

+0

Ti suggerisco di aprire una domanda diversa, perché sembra essere un problema diverso. Pubblica l'intera traccia dello stack dell'eccezione lì, in modo da sapere quale entità è stata rimossa, ecc. –

+0

Ho aperto una nuova domanda. Per favore, visita [LINK] (http://stackoverflow.com/questions/32038319/hibernate-merge-cascade-orphanremoval-on-persistent-detached-entity) – InsFi

Problemi correlati