Ошибка «объект ссылается на несохраненный временный экземпляр» при попытке обновить сущность с атрибутом OneToMany - PullRequest
0 голосов
/ 28 апреля 2020

После долгого времени без получения ошибок такого рода, в моем текущем проекте я столкнулся с этой проблемой с одним моим классом сущностей. У меня есть это:

@Entity
public class Produto extends Model {
...
  @OneToMany(fetch = FetchType.EAGER)
  @OrderColumn
  private List<Arquivo> versaoGratuita;

  @OneToMany(fetch = FetchType.EAGER)
  @OrderColumn
  private List<Arquivo> versaoPaga;
...
}

, которое обновляется с помощью этого метода в моем классе Дао:

public abstract class Dao<E> {
  @Autowired
  private EntityManagerFactory factory;
...
  public EntityManager getEntityManager() {
    return factory.createEntityManager();
  }
...
  public E update(E object) {
    EntityManager entityManager = getEntityManager();
    entityManager.getTransaction().begin();
    entityManager.merge(object);
    entityManager.getTransaction().commit();
    entityManager.close();
    return object;
  }
...
}

, а для сущности Arquivo у меня есть PropertyEditor класс:

public class ArquivoEditor extends PropertyEditorSupport {
  @Override
  public void setAsText(String text) {
    if (!text.equals("")) {
      Integer id = Integer.parseInt(text);
      ArquivoService serv = new ArquivoService();
      org.loja.AppContextHolder.getContext().getAutowireCapableBeanFactory().autowireBean(serv);
      Arquivo arquivo = (Arquivo) serv.findBy("id", id);
      setValue(arquivo);
    } else {
      setValue(null);
    }
  }
}

и когда я пытаюсь обновить класс Produto (операция вставки работает нормально, без ошибок), я получаю эту ошибку:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: org.loja.model.arquivo.Arquivo

, но сущность иногда кажется обновляться правильно? Как я уже сказал, у меня давно такой вопрос. Кто-то может дать подсказку, как устранить эту ошибку go? Я знаю, я сказал, что, кажется, хранит сущность Arquivo, но я думаю, что, если выдаст ошибку, это может вызвать серьезные проблемы позже?

update

in форма, используемая для отправки данных сущности на сервер, этот атрибут Arquivo представляется следующим образом (код html с тимилиф):

image

строка:

<input th:each="arq,stat : ${command.versaoGratuita}" th:if="${#strings.equals(arq.type, 'exe')}" type="hidden" th:name="${'versaoGratuita[' + stat.index + ']'}" th:value="${arq.id}"/>

- это тот, который содержит атрибут id, используемый классом PropertyEditor для извлечения сущности из базы данных.

...