首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用Spring + Hibernate JPA时不添加persistence.xml时处理原生SQL的实体

在使用Spring + Hibernate JPA时不添加persistence.xml时处理原生SQL的实体
EN

Stack Overflow用户
提问于 2016-11-11 00:25:43
回答 2查看 1.1K关注 0票数 0

请考虑问题已结束。在使用JPA2.0时,我的usecase似乎没有解决方案。在这种情况下,我忽略了JPA2.0的局限性。不使用persistence.xml.,JPA2.0不支持自定义实体

我正在尝试测试我的应用程序,以使用Spring + Hibernate JPA,同时避免使用专用的persistence.xml。完全使用注释。

我所使用的API是Spring4.3.3和HibernateJPA-2.0在IBMS8.0上使用的

我不知道我的使用可能会有什么差距。对我来说,这也可能是一个简单的失误。

目标是执行本机查询并将结果映射到bean类。我能够用实体测试我的应用程序。JPA能够根据实际的数据库表验证它们的映射。

为什么使用本机查询而不编写完整的实体->查询涉及多个联接。不需要将查询中涉及的所有表作为实体包括在内。

与jpa相关的部分应用程序上下文xml如下所示

代码语言:javascript
复制
<bean id="jpaVendorApdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="databasePlatform" value="org.hibernate.dialect.DB2Dialect"></property>
    <property name="showSql" value="true" />
</bean>

<bean id="testEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  <property name="dataSource" ref="testDB2DataSource" />
  <property name="packagesToScan" value="com.app.dao" />
  <property name="jpaVendorAdapter">
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
  </property>
  <property name="jpaProperties">
     <props>
        <prop key="hibernate.hbm2ddl.auto">validate</prop>
        <prop key="hibernate.dialect">org.hibernate.dialect.DB2Dialect</prop>
     </props>
  </property>

为我的示例添加一个简单的示例,用于本机查询的bean类如下所示

代码语言:javascript
复制
public class OwnerDetails implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    @Id
    private String userInitials;

    private String teamCd;

    public String getUserInitials() {
        return userInitials;
    }

    public void setUserInitials(String userInitials) {
        this.userInitials= userInitials;
    }

    public String getTeamCd() {
        return teamCd;
    }

    public void setTeamCd(String teamCd) {
        this.teamCd= teamCd;
    }
}

如果查询是

从APPTEAM中选择B.USER_INITS作为userInitials,选择B.TEAM_CD作为teamCd,在A.APP_OWNER_ID = B.SIGN_ON_ID上加入PQID,其中A.APP_NAME = :appName

代码块来执行本机查询。

代码语言:javascript
复制
Query query = entityManager.createNativeQuery(queryString, className)(QUERY_STRING, OwnerDetails.class);
    query.setParameter("appName", "TESTAPP");


    OwnerDetails  result = (OwnerDetails ) query.getSingleResult();

在执行查询时,我会遇到下面的异常

原因: org.hibernate.MappingException:未知实体: com.app.dao.entity.OwnerDetails

我知道这是因为不包括@Entity注释,但是当我包含实体注释时,我会得到一个不同的错误

原因: org.hibernate.HibernateException:缺少表: OwnerDetails . 由: javax.persistence.PersistenceException: PersistenceUnit:默认无法生成EntityManagerFactory引发

我想知道在不使用persistence.xml的情况下设置JPA缺少的链接

更新-由于API是JPA2.0命名的原生查询将不受支持

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-11 20:02:03

如果您使用的是JPA2.1版本,请确保您有以下这些烦恼:

代码语言:javascript
复制
@NamedNativeQuery (name = "some name"
query = "SELECT B.USER_INITS as userInitials, B.TEAM_CD as teamCd FROM APPTEAM A JOIN PQID B ON A.APP_OWNER_ID = B.SIGN_ON_ID WHERE A.APP_NAME = :appName"
resulSetMapping = "OwnerDetails") 

以及:

代码语言:javascript
复制
@SqlResultSetMapping(name="some name", classes = {
    @ConstructorResult(targetClass = OwnerDetail.class, 
    columns = {@ColumnResult(name="userInitials"), @ColumnResult(name="teamCd")})
}) 

然后你就把结果投出来了。但是,如果您使用的JPA版本少于2.1,那是不可能的。

票数 0
EN

Stack Overflow用户

发布于 2016-11-11 02:16:38

试试这些步骤。

  1. @Entity注释放在类中
  2. @Table注释放在类中 @Entity @Table(name="YourTableName") //如果您没有输入名称,则dafault值是您的类名公共类OwnerDetails实现的可序列化{}
  3. 确保您的表是否存在。

编辑:

如果OwnerDetails不是实体,而且您使用的是JPA2.1,那么您可以使用SqlResultSetMapping与ConstructorResult

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40539347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档