devo classi utente e l'indirizzo come segue:Perché @OneToOne consente associazioni duplicate?
class User
{
...
...
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="addr_id")
private Address address;
}
class Address
{
...
...
@OneToOne(mappedBy="address")
private User user;
}
Ecco la mia ipotesi è con questo modello di dominio posso associare un indirizzo ad un solo utente (user.addr_id deve essere univoco).
Ma con questo modello di dominio, sono in grado di creare più utenti e associarli allo stesso indirizzo.
User u1 = new User();
//set data
Address addr1 = new Address();
//set data
u1.setAddress(addr1);
...
session.save(u1);
-> questo crea un record indirizzo con addr_id = 1 e inserendo un record utente in tabella utente con addr_id = 1. Belle.
Nuovamente,
User u2 = new User();
//set data
Address addr1 = (Address) session.load(Address.class, 1);
//set data
u2.setAddress(addr1);
...
session.save(u2);
-> Ciò crea disco secondo utente ed associando all'indirizzo esistente con addr_id = 1, che non è desiderato.
Posso usare @OneToOne (..) @ JoinColumn (name = "addr_id", unique = true) per impedire questo. Ma quale sarà la differenza nell'usare @OneToOne piuttosto che @ManyToOne (.., unique = true).
@OneToOne stesso dovrebbe imporre condizioni "univoco = vero" ... giusto?
-Siva
Ho affrontato lo stesso problema. 'OneToOne' dovrebbe essere rinominato in' OneToOneOnEntityLevel'. Allo stesso modo 'JpaRepository.save()' dovrebbe essere 'jpaRepository.saveOrMerge()'. Queste due cose possono portare alla corruzione dei dati a livello di db. –