Java Spring Boot Hibernate 5忽略@Table和@Column
这让我快发疯了 我正在实现SpringSocial,它要求您拥有一个名为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应用程序只命名一个表(及其对应的列),以使用驼峰大
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。。。那么,有没有办法知道某个列是否属于具有您自己命名策略的表?