У меня есть отношение @ManyToMany между классом A и классом B: класс A ссылается на коллекцию экземпляров класса B, и это отношение настраивается как CascadeType.ALL. Поэтому, когда A сохраняется с менеджером сущностей, экземпляры B, на которые ссылается A, также сохраняются.
И A, и B имеют идентификатор, объявленный стратегией GenerationType.IDENTITY для использования auto_inc из базы данных MySQL.
Проблема:
- Я создаю новый A
- Я загружаю некоторые существующие объекты B из entityManager, используя JPQL
- Я добавляю объекты B в коллекцию Bs
=> JPA пытается сохранить объекты B, хотя они уже сохранены (они только что были загружены).
Я не понимаю, почему он пытается сохранить их снова, они были правильно загружены, и их автоматически сгенерированный идентификатор также хорошо загружен.
Декларация ManyToMany:
@ManyToMany(cascade={CascadeType.ALL})
@JoinTable(name = "ENTRY_ENTITIES", joinColumns =
@JoinColumn(name = "ENTRY", referencedColumnName = "ID"),
inverseJoinColumns = @JoinColumn(name = "ENTITY", referencedColumnName = "ID"))
private List<Entity> entities;
Запрос на загрузку существующих объектов из базы данных:
T result = (T) entityManager.createQuery("SELECT x FROM " + entityName + " x WHERE x.externalId='" + externalId + "'").getSingleResult();
Постоянные:
UserTransaction transaction = getTransaction();
try {
transaction.begin();
entityManager.persist(entity);
transaction.commit();
} catch (Throwable t) {
Logger.getLogger(JpaDao.class.getName()).log(Level.SEVERE, null, t);
}
Большое спасибо за вашу помощь!