hibernate自动生成表达问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate自动生成表达问题相关的知识,希望对你有一定的参考价值。

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource"/><!-- 注入数据源 -->
<property name="mappingResources">
<list>
<value>com/tank/bean/Person.hbm.xml</value> <!-- 映射hibernate文件 -->
</list>
</property>
<property name="hibernateProperties"><!-- 配置hibernate的属性信息 -->
<value>
hibernate.dialect=org.hibernate.dialect.Oracle9Dialect
hibernate.hbm2ddl.auto=update <!-- 自动生成数据库表 -->
hibernate.show_sql=true <!-- 在控制台显示sql语句 -->
hibernate.format_sql=false <!-- 是否对显示的sql语句进行格式化 -->
</value>
</property>
</bean>

这有什么问题吗?
为什么老是不能自动生成呢?
我知道你写的这种方法!
能够自动创建表的, 我是不用<props>属性
直接用value
用oracle做数据库,在安装的时候就创建了一个数据库orcl,在此就是想通过我上述方法来自动创建表

这个配置没错,可能以下问题:
1.oracle服务
2.Person.hbm.xml配置文件
3.myDataSource配置有问题吧,参照这个看看:
<bean id="myDataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver">
</property>
<property name="url"
value="jdbc:oracle:thin:@localhost:1521:orcl">
</property>
<property name="username" value=""></property>
<property name="password" value=""></property>
</bean>
参考技术A <property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.mysqlDialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.show_sql">false</prop>
</props>
</property>
需要先建立数据库

JPQL 构造函数表达式 - org.hibernate.hql.ast.QuerySyntaxException:表未映射

【中文标题】JPQL 构造函数表达式 - org.hibernate.hql.ast.QuerySyntaxException:表未映射【英文标题】:JPQL Constructor Expression - org.hibernate.hql.ast.QuerySyntaxException:Table is not mapped 【发布时间】:2012-08-29 13:47:43 【问题描述】:

我原来的问题是https://***.com/questions/12172614/hql-join-without-foreign-key-reference 但找不到任何解决方案,因此使用 JPA 进行本机查询。 entityManager 的 createNativeQuery 返回 Query 对象,该对象又返回 List&lt;Object[]&gt;。我不想在迭代列表时处理索引,因为它本质上很容易出错。因此,我查看了一些其他解决方案,并发现 JPQL 的构造函数表达式作为解决方案之一。

表结构是

Schema1 -TableA

 - NameColumn
 - PhoneColumn

对应的Java类是

    public class PersonSearch implements Serializable 

    public PersonSearch (String NameColumn, String PhoneColumn) 
        this.name = NameColumn;
        this.phone = PhoneColumn;
    

    private String name;

    private String phone;

    public String getName() 
    return name;
    

    public void setName(String name) 
    this.name = name;
    

    public String getPhone() 
    return phone;
    

    public void setPhone(String phone) 
    this.phone = phone;
    
    

查询是

 Select NEW com.xyz.PersonSearch(ms.NameColumn, ms.PhoneColumn) From Schema1.TableA ms Where ms.PhoneColumn='9134409930'

使用 entityManager API 运行此查询时

entityManager.createQuery(queryString, PersonSearch.class);

遇到错误。

Caused by: org.hibernate.hql.ast.QuerySyntaxException: Schema1.TableA is not mapped   [Select NEW com.xyz.PersonSearch(ms.NameColumn, ms.PhoneColumn) From Schema1.TableA ms Where ms.PHONE='9134409930']

我的代码有什么问题?有什么想法吗?

【问题讨论】:

您应该使用带有结果集映射器的本机查询。 你不是用createQuery(String, Class)代替createNativeQuery(String, Class)吗?我认为 JPA 期望 TableA 成为一个模型类,而不是将其用作表名。 @arturo,如果我使用 createNativeQuery(String,class),得到一个异常 org.hibernate.MappingException: Unknown entity:com.xyz.PersonSearch。我认为,在这种情况下,它也希望它是实体。我找不到合适的文档来使用它。 谁说你应该使用 createNativeQuery?他说您的 JPQL 查询是错误(在 JPA 规范和任何体面的 JPA 实现的文档中定义得足够好)。 【参考方案1】:

根据《Pro EJB 3 Java Persistence API》一书

构造函数表达式

涉及多个表达式的更强大的SELECT 子句形式是构造函数 表达式,它指定查询的结果将使用用户指定的方式存储 对象类型。考虑以下查询:

SELECT NEW example.EmployeeDetails(e.name, e.salary, e.department.name)
FROM Employee e

这个查询的结果类型是example.EmployeeDetails。作为查询处理器 遍历查询的结果,它使用 EmployeeDetails 实例化新实例 与查询中列出的表达式类型匹配的构造函数。在这种情况下,表达式 类型为 String、Double 和 String,因此查询引擎将使用这些类型搜索构造函数 参数的类类型。因此,结果查询集合中的每一行都是 EmployeeDetails 包含员工姓名、工资和部门名称。

必须使用对象的完全限定名称来引用结果对象类型。这 然而,类不必以任何方式映射到数据库。任何具有构造函数的类 与SELECT 子句中列出的表达式兼容,可以在构造函数中使用 表达。

构造函数表达式是构建粗粒度数据传输的强大工具 用于其他应用层的对象或视图对象。而不是手动构建 这些对象,可以使用单个查询将视图对象聚集在一起,以便呈现 在网页上。

示例代码如下

List result = em.createQuery("SELECT NEW example.EmpMenu(e.name, e.department.name) " +
         "FROM Project p JOIN p.employees e " +
         "WHERE p.name = ?1 " +
        "ORDER BY e.name").setParameter(1, projectName).getResultList();

EmpMenu 类是一个简单的 pojo,没有注释,但有正确的构造函数来匹配构造函数表达式。结果是返回的每一行的 EmpMenu 对象列表。

我相信您的 SQL 部分“....来自 Schema1.TableA ms ..”应该指的是映射的实体。因此,您应该将实体映射到 TableA,然后 jpql 应该更像“.... From MyTableAEntity ms ...”的内容,其中 MyTableAEntity 具有将其映射到 DB 表 TableA 的所有正确 jpa 注释。正如书 sn-p 所述,“SELECT NEW ...”的目标不必映射,但 FROM 子句中引用的实体可以。

【讨论】:

以上是关于hibernate自动生成表达问题的主要内容,如果未能解决你的问题,请参考以下文章

hibernate生成表出现问题!

自己动手写ORM(01):解析表达式树生成Sql碎片

Hibernate 根据实体类自动生成表问题

Myeclipse10.7自动生成hibernate时需要注意的问题

Hibernate 手动和自动生成的主键

如何设置在 Java JPA/Hibernate 中不是自动生成的 @Id 主键?