2016-03-08 76 views
4

(我的英语很抱歉,这不是我的自然语言)休眠5 JPA:无冬眠模式在实体指定的访问

所以,我有一个Maven + SPRING + JPA + Hibernate的+ MSYQL应用。 我想将hibernate 4.3.11升级到最新版本的hibernate v5。

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 
    <version>4.3.11.Final</version> 
</dependency> 

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-entitymanager</artifactId> 
    <version>5.1.0.Final</version> 
</dependency> 

但是当我试图访问一个实体至极表是不是在默认模式,我有一个错误。 升级之前,它很好。 访问一个实体,这个表在默认模式下适用于V5休眠。

默认模式是“角色”,但在我的应用程序的所有实体中,我在@table JPA Annotation中显式使用模式。 即使架构是“角色”

实体:

@Entity 
@Table(schema="modeler",name="concept") 

public class Concept { 

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
@Column(unique=true, nullable=false, updatable = false) 
private int idconcept; 

@Column(name="action_date", nullable=false) 
protected LocalDate actionDate; 

... 

public Concept() {} 

... 

} 

当我尝试用该实体的读访问,我有Java错误:

Exception: org.hibernate.exception.SQLGrammarException: could not extract ResultSet 


In the stack, the cause is : 
     "errorCode": 1146, 
     "nextException": null, 
     "sqlstate": "42S02", 
     "localizedMessage": "Table 'roles.concept' doesn't exist", 
     "message": "Table 'roles.concept' doesn't exist", 
     "suppressed": [] 

in the log of hibernate, i saw the sql order doesn't contain the schema. 

Sql order with hibernate 5 

    select concept0_.idconcept as idconcep1_0_, concept0_.action_date a saction_d2_0_, ..., from concept concept0_ 

Sql order before with hibernate 4.3.11 

    select concept0_.idconcept as idconcep1_0_, concept0_.action_date a saction_d2_0_, ..., from modeler.concept concept0_ 

当我试图坚持该实体,我在相同的主题,但在hibernate_sequence表中有一个错误

Exception: org.hibernate.exception.SQLGrammarException: error performing isolated work 

In the stack, the cause is 
     "errorCode": 1146, 
     "nextException": null, 
     "sqlstate": "42S02", 
     "localizedMessage": "Table 'roles.hibernate_sequence' doesn't exist", 
     "message": "Table 'roles.hibernate_sequence' doesn't exist", 
     "suppressed": [] 


in the log of hibernate, the sql order doesn't contain the schema. 

    select next_val as id_val from hibernate_sequence for update 

--> but, it's seems that it's the same schema problem as in read access. 

所以我试图在我的问题之前找到解决方案。 我在休眠站点发现版本v5.0.8是稳定的,并尝试过它。 我有同样的问题。

所以我读了V5.0.8的演变。 我唯一关注的变化是:命名策略 我修改了我的xml弹簧配置,并在网络上找到了一些解决方案。 但它不起作用。

xml spring配置的提取物

<tx:annotation-driven transaction-manager="transactionManager" /> 
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 


<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceXmlLocation" value="classpath:config/persistence.xml" /> 
    <property name="persistenceUnitName" value="demoRestPersistence" /> 
    <property name="dataSource" ref="restDemoDS" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
     </bean> 
    </property> 

    <property name="jpaPropertyMap"> 
     <map> 
      <entry key="hibernate.show_sql" value="true" /> 
      <entry key="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> 
      <entry key="hibernate.implicit_naming_strategy" value="org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl" /> 
     </map> 
    </property> 

</bean> 

<bean id="restDemoDS" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource" 
    scope="singleton"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost:3306/roles" /> 
    <property name="username" value="***" /> 
    <property name="password" value="******" /> 
</bean> 

感谢您的帮助。

+0

这与[此问题]有关(https://stackoverflow.com/questions/11184025/what-are-the-jpa-table-annotation-catalog- and-schema-variables-used-for),但可能不是真的重复 – avalancha

回答

3

所以我发现了这个问题。

因为Hibernate的5版本(不知道为什么,什么),如果你访问一个数据库MySQL的几个方案,这个注释是不正确的了:

@Table(schema="modeler",name="concept") 

你必须完成的注解与参数catalog

@Table(catalog="modeler",schema="modeler",name="concept"). 

有了这个补充,应用程序运行。有关目录属性的更多信息可参见hibernate user guide