Создание прокси-объектов Hibernate - PullRequest
1 голос
/ 08 апреля 2020
public class Account {
    private int pk;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "profileFK")
    private Profile profile;
}

public class Profile {
    private int pk;
    private String name;
}

У меня есть учетная запись и profilePk, и я хочу иметь возможность установить отношение, не получая профиль из базы данных, есть ли способ создать HibernateProxy, когда у меня есть PK для него?

Я попытался просто создать новый профиль, включив в него только PK, который работает при сохранении в db, но также помещает «пустой» объект в кэш гибернации.

Profile dbProfile = new Profile();
dbProfile.setName("name");
profileDao.create(dbProfile);

Profile profile = new Profile();
profile.setPk(dbProfile.getPk());
account.setProfile(profile);
accountDao.save(account);

Account dbAccount = accountDao.get(account.getPk());
assertNull(dbAccount.getProfile().getName());
accountDao.refresh(dbAccount);
assertEquals("name", dbAccount.getProfile().getName());

Но я хочу сделать что-то вроде этого

Profile dbProfile = new Profile();
dbProfile.setName("name");
profileDao.create(dbProfile);

account.setProfile(Hibernate.newProxy(Profile.class, dbProfile.getPk()));
accountDao.save(account);

Account dbAccount = accountDao.get(account.getPk());
assertEquals("name", dbAccount.getProfile().getName());

Или есть другой вариант, когда мне не нужно получать профиль из БД перед сохранением учетной записи? Мы переносим сотни сгенерированных старых объектов с помощью mapstruct в jpa, и что-то вроде этого значительно упростит общее решение c.

1 Ответ

1 голос
/ 08 апреля 2020

Согласно документации на спящий режим вы должны сделать что-то вроде этого:

Profile dbProfile = new Profile();
dbProfile.setName("name");
profileDao.create(dbProfile);

account.setProfile(entityManager.getReference(Profile.class, dbProfile.getPk()));
accountDao.save(account);
...