У меня есть класс, который реализует java.util.Collection и также аннотируется как @Entity.Как мне сохранить этот класс как Entity
, а не Collection
.
Я пытаюсь использовать EntityManager.persist(Object entity)
, но это вызывает исключение из данных Spring:
org.springframework.data.mapping.MappingException: не удалось найти PersistentEntity для типа java.lang.Object!
Используется при использовании весенней загрузки 2.0.7.RELEASE, но я пытаюсь перейти на spring-boot 2.1.1.RELEASE (которая использует spring-data-jpa: 2.1.3.RELEASE).
Из того, что я могу сказать, есть «новый»PersistentPropertyPathFactory
, который теперь использует «actualType», чтобы определить, к какому типу относится сущность, которую необходимо сохранить.Тем не менее, «actualType» для моей сущности в конечном итоге просто будет java.lang.Object
, потому что он isCollectionLike
(то есть мой тип является коллекцией, поэтому он удовлетворяет проверке Collection.class.isAssignableFrom(rawType)
).
Что я действительно хотел бы,чтобы моя сущность сохранялась как свой собственный тип вместо того, чтобы EntityManager пытался сохранить его как коллекцию.
Кто-нибудь знает, как это сделать, или есть какая-то документация, в которой говорится, что сущность не должна быть коллекцией?
Вот упрощенный пример класса Entity / Collection:
@Entity
public class ContainerCollection<C extends Container> extends Container implements Collection<C> {
@JoinTable(
name = "mod_container_collections",
joinColumns = @JoinColumn(name = "container_collection_id"),
inverseJoinColumns = @JoinColumn(name = "container_id"))
protected Set<C> containers = new HashSet<>();
@Override
public int size() {
return containers.size();
}
@Override
public boolean isEmpty() {
return containers.isEmpty();
}
// other Collection methods implemented to delegate to containers
// with some relationship management in add(Object) and remove(Object)
}
А вот действительно простой тест, который демонстрирует, что я хотел бы сделать:
public class PersistenceTest {
@PersistenceContext
private EntityManager em;
public void testPersist() {
ContainerCollection<> collection = new ContainerCollection<>();
em.persist(collection); // this line throws MappingException
}
}