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

Hibernate 5 with JPA:在实体中不指定模式sp的情况下进行Hibernate访问

黄景胜
2023-03-14

我有一个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 hibernate默认模式中的实体。

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

实体:

@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错误:

org.hibernate.exception.无法提取结果集

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": []

在Hibernate日志中,我看到SQL顺序不包含模式。

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表

异常:org.hibernate.exception.SQLGrammar异常:错误执行孤立的工作

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": []

在hibernate的日志中,SQL顺序不包含模式。

     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.

所以我试着在提出问题之前找到一个解决方案。我在hibernate站点上发现v5.0.8版本是稳定的,并尝试了它。我也有同样的问题。

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

我的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>

共有1个答案

徐瑞
2023-03-14

所以我发现了问题。

由于hibernate版本5(不知道为什么和什么),如果您访问具有多个模式的数据库MySQL,则此注释不再正确:

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

您必须使用参数catalog

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

有了这个补充,应用程序就可以运行了。有关catalog属性的更多信息,请参见《hibernate用户指南》

 类似资料:
  • 问题内容: 我已经在.jar文件清单中指定了Java程序的主类和类路径,但有时我想运行与该属性指定的类不同的类。我可以在仍然从清单中拉出类路径的同时让Java启动此类,这样我就不必在命令行上用来指定整个东西了吗? 问题答案: 只需使用-cp将jar文件放在命令行中即可;然后,即使您未使用-jar,Java也会观察清单中的classpath属性:

  • 问题内容: 但是,首选解决方案(属性访问)在我的情况下不起作用(我缺少列异常-为什么?) 该模型如下所示:实体和。表含有列是的表,以便它是典型的关系。 现在的问题是,如果我取的实体,我需要有机会获得价值(亦称的实体),而不取实体。我怎样才能做到这一点? 我使用的映射如下所示: 我想做的是调用而无需从DB中额外获取实体。 根据我上面提到的答案,如果我将注释从字段移到getter(在实体上,我对吗?)

  • 问题内容: 我想将实时生产数据库复制到本地开发数据库中。有没有一种方法可以不锁定生产数据库? 我目前正在使用: 但是它在运行时锁定每个表。 问题答案: 该选项有效吗? 根据手册页,如果要转储InnoDB表,则可以使用以下选项: 对于 innodb DB :

  • 我有以下2个实体: 它们有共享字段/列,例如:等,但是每个主键id字段的名称不同,例如有和 有没有一种方法可以创建一个基本实体超类来保存这些通用的

  • 问题内容: 有人知道如何让JTextArea在所有平台上显示固定大小的字体吗? 我想创建一个具有保存/打开功能的简单代码编辑器,这很简单,但是我想将字体设置为固定大小,最好是速写。 问题在于,courier new显然是专有的,不仅在许多系统上默认没有安装它,而且在大多数现代系统上,它都默认设置为cleartype,这使其看起来像垃圾。 我很想用update-render- paint制作自己的J

  • 问题内容: 有没有一种方法可以确定给定的示例实体类: 所谓“新”,是指有人调用了新的A()甚至可能设置了名称,但从未保存或保留。 通常,人们可以检查id,但是我想要一种不需要id或getId()方法的解决方案。 基本上,即使在分离模式下,此实体也已持久化到数据库中。 @Version或getVersion也不是令人满意的解决方案。 也许是独立的|| isAttached可能有效,但是我不确定如何在