如何持久化实现Collection的实体

时间:2018-12-28 01:56:04

标签: jpa spring-data-jpa spring-data

我有一个实现java.util.Collection的类,并且也标注为@Entity。我如何以Entity而不是Collection的形式持久化该类。

我正在尝试使用EntityManager.persist(Object entity),但这会引发spring数据声明异常:

  

org.springframework.data.mapping.MappingException:找不到类型java.lang.Object的PersistentEntity!

这在使用spring-boot 2.0.7.RELEASE时曾经有效,但是我试图升级到spring-boot 2.1.1.RELEASE(使用spring-data-jpa:2.1.3.RELEASE)。 / p>

据我所知,现在有一个“新” PersistentPropertyPathFactory,它使用“ actualType”来确定需要保留的实体类型。但是,我的实体的“ actualType”最终只是java.lang.Object,因为它是isCollectionLike(即我的类型是Collection,所以它满足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
    }

}

0 个答案:

没有答案