В твоем вопросе не понятно, как ты получаешь свою энтити. Если, как ты описал выше, просто делаешь workout w= new workout(), то получишь пустой джава объект. Ты ведь где-то делаешь get() или load(), ну либо другим любым способом получаешь данные для твоей энтити. Затем, судя по проблеме, у тебя просто не подтянулся юзер из бд( ну либо из мема, смотря какая бд). Но раз вопрос решен, то это уже не важно.
Ну да, данные приходят, допустим из контроллера, в том числе id пользователя. Но это же несущественно, откуда они приходят. Главное как раз то, что пользователь «не подтянулся». Вот работающий способ, при котором происходит то, что нужно:
Workout w = new Workout();
User user = entityManager.getReference(User.class, 2);
w.setUser(user);
entityManager.persist(w);
w.getUser().doSmth();
class Workout {
...
@ManyToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(nullable = false, name = "userId")
private User user;
...
}
Этот способ работает в том числе без «явной» выгрузки или перечитывания сущностей из базы и вообще без выгрузки, если убрать w.getUser().doSmth();
Допускаю, что я не совсем корректно сформулировал свой вопрос, хотя Роман все равно меня понял.