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
preferencefor a user, you will fill the data and select a useruser01login from dropdown and save. - If you want to edit the same
preference, you will still have the option to select user and if you selectuser02this time then backend side will have theuser02inpreferenceobject for the whole request lifetime. - Again if you reload the same
preferencethen you will see thatuser01is 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
preferenceat 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
preferenceat 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.getUser() - 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 executed before entity merge operation, you have to take care of it otherwise you might get incorrect results.