Hibernate命名策略改变表名 [英] Hibernate naming strategy changing table names

查看:266
本文介绍了Hibernate命名策略改变表名的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对休眠(5.1版本)命名策略有点困惑 - 它改变了我的表名,我想避免这种情况。另外 - spring.jpa.hibernate.naming_strategy 似乎根据intelij已被弃用,但我找不到正确配置它的(另一种)方式。



我在application.properties中有以下配置:

  spring.jpa.hibernate .naming_strategy = org.hibernate.cfg.EJB3NamingStrategy 
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.properties.hibernate.enable_lazy_load_no_trans = true
spring.jpa.properties.hibernate.current_session_context_class = thread

第一个被标记为depracted,如上所述。



现在我有一个实体:

  @Entity 
@Table(name =usaUploadTable,schema =usertable201,catalog =)
public class UsaUploadTable {
....
}

表名就像 @Table(name =) usaUploadTable 。



现在,当我运行我的应用程序时,我得到


表'usertable201。 usa_upload_table'不存在

这是正确的 - 它不像hibernate如何改变它。



如何让hibernate正确使用我的表名?



编辑:



我也试过了

  DefaultNamingStrategy 
ImprovedNamingStrategy

所有这些改变它



版本:

  spring-boot-1.4.0.RELEASE 
hibernate 5.1
javax-transaction-api 1.2
hibernate -validator 5.2.4
javassist 3.20


解决方案

问题在于spring-boot-1.4 - 它似乎已经改变了我现在发现这个答案的属性(或其他)。 ImprovedNamingStrategy不再在Hibernate 5中工作,但仍然无法正确解析。所以我改变了一些代码,不使用下划线方法,并且扩展了新引入的类 SpringPhysicalNamingStrategy

  package com.foo; 

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;

import java.io.Serializable;
import java.util.Locale;


public class RealNamingStrategyImpl extends org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy implements Serializable {

public static final PhysicalNamingStrategyImpl INSTANCE = new PhysicalNamingStrategyImpl() ;

@Override
public标识符toPhysicalTableName(标识符名称,JdbcEnvironment上下文){
返回新标识符(name.getText(),name.isQuoted());

$ b @Override
public标识符toPhysicalColumnName(标识符名称,JdbcEnvironment上下文){
返回新标识符(name.getText(),name.isQuoted()) ;
}

}

并且在 application.properties 我已将弃用的行更改为

  spring.jpa.properties.hibernate .physical_naming_strategy =< package> .RealNamingStrategyImpl 

现在它完全使用表格和列名他们在我的实体文件中。

I'm a little bit confused by hibernates (version 5.1) naming strategy - namely it changes my table name and I'd like to avoid that. Also - spring.jpa.hibernate.naming_strategy seems to be deprecated according to intelij, but I can't find a (nother) way of configuring it correctly.

I have the following configuration in application.properties:

spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
spring.jpa.properties.hibernate.current_session_context_class=thread

The first one is marked as depracted, as said.

Now I have an entity:

@Entity
@Table(name = "usaUploadTable", schema = "usertable201", catalog = "")
public class UsaUploadTable {
    ....
}

The table name is, like in @Table(name = "") usaUploadTable.

Now when I run my application, I get

Table 'usertable201.usa_upload_table' doesn't exist

which is correct - it isn't named like how hibernate is changing it.

What can I do to make hibernate use my table name correctly?

Edit:

I've also tried

DefaultNamingStrategy
ImprovedNamingStrategy

All of them change it

Versions:

spring-boot-1.4.0.RELEASE
hibernate 5.1
javax-transaction-api 1.2
hibernate-validator 5.2.4
javassist 3.20

解决方案

The problem lies in spring-boot-1.4 - it seems like they have changed the properties (or whatever) I've now found this answer ImprovedNamingStrategy no longer working in Hibernate 5, but it still didn't resolve correctly. So I have changed the code a little to not use the underscore method and to extend the newly introduced class SpringPhysicalNamingStrategy:

package com.foo;

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;

import java.io.Serializable;
import java.util.Locale;


public class RealNamingStrategyImpl extends org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy implements Serializable {

    public static final PhysicalNamingStrategyImpl INSTANCE = new PhysicalNamingStrategyImpl();

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        return new Identifier(name.getText(), name.isQuoted());
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
        return new Identifier(name.getText(), name.isQuoted());
    }

}

And in application.properties I've changed the deprecated line to

spring.jpa.properties.hibernate.physical_naming_strategy=<package>.RealNamingStrategyImpl

Now it uses exactly the table and column names as I have them in my entity files.

这篇关于Hibernate命名策略改变表名的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆