TransientObjectException: объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом - PullRequest
3 голосов
/ 03 марта 2012

Я знаю, что этот вопрос задавался много раз, но я не смог найти подходящий ответ для меня.

У меня есть две сущности в Spring Roo-приложении, которыев отношении «многие ко многим», выпуск и компонент.

Сначала я выбираю экземпляр существующего выпуска через

selectedRelease = Release.findReleasesByReleaseNumberEquals(version).getSingleResult();

. Вышеприведенный метод представляет собой сгенерированный Roo искатель, который выглядитнапример:

public static TypedQuery<Release> Release.findReleasesByReleaseNummerEquals(String releaseNumber) {
    EntityManager em = Release.entityManager();
    TypedQuery<Release> q = em.createQuery("SELECT o FROM Release AS o WHERE LOWER(o.releaseNumber) LIKE LOWER(:releaseNummer)", Release.class);
    q.setParameter("releaseNumber", releaseNumber);
    return q;
}

Затем я создаю новый экземпляр компонента и пытаюсь назначить его выбранной версии

Component component = new Component();

Set<Release> releases = new HashSet<Release>();
releases.add(selectedRelease);

component.setReleases(releases);
component.persist();

При попытке выполнить persist () я получаю исключение:

TransientObjectException: объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом: com.Release;

У кого-нибудь есть советы по этой проблеме?

Отображения выглядят следующим образом:

Release.java:

@ManyToMany(cascade = CascadeType.PERSIST, mappedBy = "releases")
private Set<Component> components = new HashSet<Component>();

Component.java

@ManyToMany(cascade=CascadeType.PERSIST)
private Set<Release> releases = new HashSet<Release>();

1 Ответ

6 голосов
/ 04 марта 2012

Сообщение ясно: вы пытаетесь сохранить объект, компонент, который ссылается на другой объект, который еще не был сохранен, selectedRelease.

Решение кажется простым: просто сохраните (и очиститевсякий раз, когда вы хотите, чтобы изменения были переданы в базу данных), объекты Release перед сохранением компонента.

Однако JPA позволяет избежать всех этих предложений с помощью TRANSITIVE PERSISTENCE, то есть каскада 1006опции в аннотациях @ ... ToMany .

Просто предупреждение, если у вас двунаправленное отношение, когда у вас есть атрибут mappedBy в одной из ассоциаций @ ... ToMany.В этом случае вам понадобится удобный метод для управления ассоциацией, то есть для установки обеих сторон ассоциации.

Например, addRelease (Release r) в Component, который добавляет релиз кнабор компонентов и устанавливает компонент (фактически, экземпляр this ) для выпуска, переданного в качестве параметра.

...