Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Boot Hibernate 5忽略@Table和@Column_Java_Spring Boot_Spring Social_Hibernate 5.x - Fatal编程技术网

Java Spring Boot Hibernate 5忽略@Table和@Column

Java Spring Boot Hibernate 5忽略@Table和@Column,java,spring-boot,spring-social,hibernate-5.x,Java,Spring Boot,Spring Social,Hibernate 5.x,这让我快发疯了 我正在实现SpringSocial,它要求您拥有一个名为UserConnection的数据库表(而不是使用下划线分隔两个单词的标准命名约定) 因此,在我天真的世界观中,我认为通过指定@Table(name=“UserConnection”)。。。但是不,那太容易了 注释被忽略,表被创建为user\u connection,这会导致Spring Social产生嘶嘶的匹配 请告诉我,有一种简单的方法可以告诉我的Spring Boot应用程序只命名一个表(及其对应的列),以使用驼峰大

这让我快发疯了

我正在实现SpringSocial,它要求您拥有一个名为
UserConnection
的数据库表(而不是使用下划线分隔两个单词的标准命名约定)

因此,在我天真的世界观中,我认为通过指定
@Table(name=“UserConnection”)
。。。但是不,那太容易了

注释被忽略,表被创建为
user\u connection
,这会导致Spring Social产生嘶嘶的匹配

请告诉我,有一种简单的方法可以告诉我的Spring Boot应用程序只命名一个表(及其对应的列),以使用驼峰大小写命名约定,而不是标准的命名约定。

TL;DR
将以下内容添加到
应用程序.yml
文件中:

spring:
  jpa:
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
或者您的
应用程序。属性

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
详细答案
正如Spring Boot 1.4所述:

SpringNamingStrategy
不再使用,因为Hibernate 5.1已被删除 支持旧的
NamingStrategy
界面。一个新的
SpringPhysicalNamingStrategy
现已自动配置,用于 与Hibernate的默认
隐式命名策略相结合
。这 应非常接近(如果不相同)弹簧护套1.3 但是,默认情况下,您应该检查数据库架构是否正确 升级时

这个新的
PhysicalNamingStrategy
遵循Spring推荐的命名约定。无论如何,如果您想完全控制物理命名,最好使用
org.hibernate.boot.model.naming.physicalnamingstrategstandardimpl
。通过将以下内容添加到
应用程序.yml
,您可以切换到该命名策略:

spring:
  jpa:
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
注释被忽略,表被创建为
user\u connection
这会导致Spring Social发出嘶嘶声

SpringPhysicalNamingStrategy
的方法是理解此行为的关键:

private Identifier apply(Identifier name, JdbcEnvironment jdbcEnvironment) {
    if (name == null) {
        return null;
    }
    StringBuilder builder = new StringBuilder(name.getText().replace('.', '_'));
    for (int i = 1; i < builder.length() - 1; i++) {
        if (isUnderscoreRequired(builder.charAt(i - 1), builder.charAt(i),
                builder.charAt(i + 1))) {
            builder.insert(i++, '_');
        }
    }
    return getIdentifier(builder.toString(), name.isQuoted(), jdbcEnvironment);
}

private boolean isUnderscoreRequired(char before, char current, char after) {
    return Character.isLowerCase(before) && Character.isUpperCase(current)
            && Character.isLowerCase(after);
}
专用标识符应用(标识符名称,JdbcEnvironment JdbcEnvironment){
if(name==null){
返回null;
}
StringBuilder=新的StringBuilder(名称.getText().replace('.','.');
对于(int i=1;i

它基本上用下划线替换了任何
和大小写更改(查看方法)。

选项1

首先,在@Entity映射上定义表名:

@Entity( name = "UserConnections")
public class UserConnection{
选项2

你应该用NamingStrategy支付一点费用。为sessionFactory bean定义属性时,请尝试添加以下内容:

<prop key="hibernate.implicit_naming_strategy">legacy-jpa</prop>
legacy-jpa
当实体未显式命名它所属的数据库表时 映射到,我们需要隐式地确定该表名。或者当 特定属性未显式命名要使用的数据库列 它映射到,我们需要隐式地确定该列名

因此,如果您不想为每个实体显式命名表名,则应遵循此策略

选项3

或者,如果上述方法不适用于您,您必须使用PhysicalNamingStrategy。尽管这是您的最后一个选择:


参考资料:

如何配置自动ddl创建?如果您将应用程序、属性和程序添加到SessionFactory中也会很好。我尝试了很多东西,但都忘了。我相信当我使用此方法时,所有其他没有使用下划线显式映射的表和列都是使用camel case重新创建的。因此,从本质上说,如果我使用这种方法,我必须遍历每一个列和表,并添加注释,用下划线符号覆盖它们。是的,我刚刚测试了它,它的行为就像我上面所说的。所有未使用@Column和@Table显式命名的表和列都将在DB中以驼峰形式创建。这很糟糕,因为我想要完全相反的效果。我只想显式映射这一愚蠢的
UserConnection
表,而不是我的所有其他表和列。@Trevor那么你应该提供你自己的
ImplicitNamingStrategy
是的,我也试过了。。。但是我不知道如何隔离与
UserConnection
表关联的列的名称。我能够正确地命名
UserConnection
表,但不能正确地命名表中所有该死的列。。。我不想盲目地将所有列的名称更改为camel-case,因为可能还有其他列的名称与camel-case相同,我不想更改为camel-case。。。那么,有没有办法知道某个列是否属于具有您自己命名策略的表?