当前位置: 首页 > 知识库问答 >
问题:

按类类型加载数据的通用Spring Data JPA存储库实现

王楚青
2023-03-14

我使用的是Spring Data JPA 1.4.3.RELEASE和Hibernate 4.2.7.Final,我成功地创建了一个基本存储库类,类似于:http://docs . Spring . io/Spring-Data/JPA/docs/1 . 4 . 2 . release/reference/html/repositories . html # repositories . custom-behavior-for-all-repositories

            @NoRepositoryBean
            public interface BaseRepository <T extends BaseEntity, ID extends Serializable>
            extends JpaRepository<T, ID>

            @NoRepositoryBean
            public class BaseRepositoryImpl<T extends BaseEntity, ID extends Serializable>
            extends SimpleJpaRepository<T, ID> implements BaseRepository<T, ID> {

我能够成功地与:

            public interface FlowerRepository extends BaseRepository<Flower, Long> {

现在,我正在尝试编写一个通用实现(扩展基本存储库)来加载所有引用数据,如Fner类型。这是因为我不想为每个“类型”数据或“引用”数据都有一个存储库。我希望能够通过传递特定的“类”类型(实现特定于引用数据类型的接口)使用通用存储库来管理它。对于E-g

            loadAll(FlowerType.class)

我使用hbm来映射hibernate实体,所以我有:

            <?xml version="1.0"?>
            <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
            <hibernate-mapping>
                <class name="xxx.FlowerType" table="FLWTYP">
                <meta attribute="extends" inherit="false">xxx.BaseReferenceType</meta>
                <id name="primaryKey" type="string">
                    <column name="TYP_CDE" length="5" />
                    <generator class="assigned" />
                </id>

            public class FlowerType extends BaseReferenceType<String> implements ReferenceEntity<String>

            public abstract class BaseReferenceEntity<T extends Serializable> extends BaseEntity implements
    ReferenceEntity<T>

            public abstract class BaseEntity implements DomainEntity

            public interface ReferenceEntity<PK extends Serializable> {

持久性XML:

            <?xml version="1.0" encoding="UTF-8" standalone="no"?>
            <persistence xmlns="http://java.sun.com/xml/ns/persistence"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"
                xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
                <persistence-unit name="xxxPU"
                    transaction-type="RESOURCE_LOCAL">
                    <provider>org.hibernate.ejb.HibernatePersistence</provider>
                    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
                    <properties>
                        <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
                        <property name="hibernate.hbm2ddl.auto" value="none" />
                        <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" />
                        <property name="hibernate.connection.charSet" value="UTF-8" />
                        <property name="hibernate.jdbc.batch_size" value="100" />
                        <property name="hibernate.show_sql" value="false" />
                        <property name="hibernate.format_sql" value="false" />
                        <property name="hibernate.transaction.flush_before_completion"
                            value="false" />
                        <property name="hibernate.connection.autocommit" value="false" />
                        <property name="hibernate.ejb.cfgfile" value="hibernate.cfg.xml"/>
                        <property name="jadira.usertype.autoRegisterUserTypes" value="true" />
                        <property name="jadira.usertype.databaseZone" value="jvm" />
                        <property name="jadira.usertype.javaZone" value="jvm" />
                    </properties>
                </persistence-unit>
            </persistence>

Hibernate配置:

            <?xml version="1.0" encoding="UTF-8"?>
            <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                                 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
            <hibernate-configuration>
                <session-factory>
                    <mapping resource="FlowerType.hbm.xml"/>
                    <mapping resource="Flower.hbm.xml"/>
                </session-factory>
            </hibernate-configuration>

所以我看了一些教程链接和帖子,并根据以下内容做了一些工作:

Spring Jpa将自定义功能添加到所有存储库,同时将其他自定义功能添加到单个存储库

我有:

            @NoRepositoryBean
            public interface CustomReferenceDataRepository<T extends BaseEntity & ReferenceEntity<PK>, PK extends Serializable> {
                public Map<PK, T> findAll(Class<T> clz);
            }

            public interface ReferenceDataRepository extends BaseRepository, CustomReferenceDataRepository {
            }

            public class ReferenceDataRepositoryImpl<T extends BaseEntity & ReferenceEntity<PK>, PK extends Serializable>
                    implements CustomReferenceDataRepository<T, PK> {

                @PersistenceContext
                private EntityManager em;


                @Override
                public Map<PK, T> findAll(Class<T> clz) {
                //do whatever
                    return null;
                }

            }

以一个例外结束:

            Caused by: java.lang.IllegalArgumentException: Not an managed type: class xxx.BaseEntity
                at org.hibernate.ejb.metamodel.MetamodelImpl.managedType(MetamodelImpl.java:200) ~[hibernate-entitymanager-4.2.7.Final.jar:4.2.7.Final]
                at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:68) ~[spring-data-jpa-1.4.3.RELEASE.jar:na]
                at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getMetadata(JpaEntityInformationSupport.java:65) ~[spring-data-jpa-1.4.3.RELEASE.jar:na]
                at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:146) ~[spring-data-jpa-1.4.3.RELEASE.jar:na]

我知道Hibernate不管理“BaseEntity ”,但是我不知道我遗漏了什么。

我对参考数据实现通用存储库的需求可能实现吗?如果是,我做错了什么?感谢任何指导。谢了。

共有1个答案

裴金鑫
2023-03-14

您还必须为BaseEntity添加映射:

<class name="xxx.BaseEntity " abstract="true">

您也可以尝试使用注释并仅设置包ToScan属性

 类似资料:
  • 我正在使用100个实体(使用JHipster)设置一个新的Spring Boot API,我的问题是:鉴于我有一组存储库层方法,我希望我的所有存储库都能够调用这些方法。 我已经尝试制作所有接口来扩展('RepositoryQuery'是我默认的自定义接口名称后缀),然后使用特定于实体的类。请注意,所有的类扩展了一个泛型实现类,名为。 请注意,给定正则表达式中的“.*”代表我的持久实体集中的任何实体

  • 对于spring boot、spring jpa、spring amqp,我有以下场景: 我的应用程序负责将数据复制到不同的数据库,但使用相同的实体,我必须存储/更新数据的数据库将在运行时根据即将到来的rabbit amqp数据决定。 我知道,使用spring jpa,我们可以拥有多个数据源,而使用@EnableJpaRepositories,我们可以通过如下方式指定基本包来选择repositor

  • 问题内容: 所以我的问题是,我在Android(Java)上编写了一个函数,该函数需要两个Double,两个Int和一个Calendar对象。我相信提供的允许它在单独的线程中运行的类AsyncTask仅接受一种类型的Object(但允许多种)作为参数,因此我认为我可以将其放入List或LinkedList或其他内容中。 是否存在允许多个数据类型()的类型,还是我必须创建自己的对象类?我是一个新手程

  • 好吧,我一直在Kotlin试验原始数据存储,我有一个问题。我正在使用以下内容。原型文件: 这是我的序列化程序类: 和我的存储库: 因此,在我的updateValue()方法中,我可以设置“name”字段的名称,但我没有地址消息字段的setter,如street和number。编译器只显示getter。在姓名和年龄字段的另一边,我有setters。如何对这两个地址字段使用setters:街道、编号?

  • 我有两个PSR-4 composer项目,我希望从一个项目到另一个项目,文件结构如下: composer.json文件被定义为项目库 和项目栏为: 运行正确地生成包含companyname/foo文件夹的供应商文件夹。 在在projectfoo中,我有: 但是,当run未定义时。 为什么自动加载中不包括。php文件? 刷新自动加载文件使用: 将供应商名称更改为不同的名称。 查看文件夹中的文件,条形

  • 我正在尝试在Spring应用程序中设置第二个数据源。以下是两个数据源的两个配置类: 第二个配置类: 我在com上看到过。XYXYale。坚持不懈XY a Spring数据JPA回购协议定义如下 德莫雷波 人口学 DemoRepoImpl 回购协议的使用方式如下: 我得到一个例外: 有人对如何解决这个问题有建议吗?我可以想到为每个回购注入正确的实体经理,但是我不知道如何做到这一点。 提前感谢。在这里