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);
Hai mostrato i mapping esatti? Non ci sono cascate da 'Car' a' User'? –
@DraganBozanovic, ho aggiornato il post. E sì, ci sono cascate. – InsFi