Issue of @OneToOne with @MapsId and how to avoid it
Tip submitted by @pmverma
Following is a known issue regarding using @OneToOne
with @MapsId
and some tips to avoid it.
The issue
Let’s say you have a Preference
class which you have associated to User
with @OneToOne @MapsId
.
class Preference {
@OneToOne
@MapsId
private User user;
}
Normally with JHipster,
- When you add a
preference
for a user, you will fill the data and select a useruser01
login from dropdown and save. - If you want to edit the same
preference
, you will still have the option to select user and if you selectuser02
this time then backend side will have theuser02
inpreference
object for the whole request lifetime. - Again if you reload the same
preference
then you will see thatuser01
is there, notuser02
.
The incorrect part here is:
user02
in preference
object in no.2 step. The user object in preference
should always refer to user01
.
For more information, take a look at https://github.com/jhipster/generator-jhipster/issues/9100
### Tips to avoid it
- Hide the dropdown and set the current user in
preference
at client side programmatically. (Again this kind of solution is only valid for entities such as Preference, Settings, User Profile and so on, where having a dropdown to choose user does not makes sense. ) - Hide the dropdown and set the current user in
preference
at server side programmatically. (Again this kind of solution is only valid for entities such as Preference, Settings, User Profile and so on, where having a dropdown to choose user does not makes sense. JHipster have already provided a method to get current user.) - Validate and load the correct association value before doing any business logic on that user. (Again this is needed only if your logic depends on
preference.gerUser()
- If you are using Hibernate 5.4.2 and later then you will get correct association value but only after entity merge operation has finished. So if your business logic is excuted before entity merge operation, you have to take care of it otherwise you might get incorrect results.