Как мне сохранить сущность, которая реализует коллекцию - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть класс, который реализует 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
    }

}
...