【问题标题】:Define PK_name via JPA annotation通过 JPA 注解定义 PK_name
【发布时间】:2020-06-02 23:20:47
【问题描述】:

我正在使用带有 SQL Server 的 Spring Boot,我想从 Spring 中定义 PK_name,而不是让它自动生成。

Hibernate 正在向主键添加一个后缀。

所以我想用这个名字代替 PK__Team__3214EC07FA39AD63,而不是 PK_Team

 @Entity
public class Team {
  @Id
@Column(name = "Id" )
private Integer id;
@Column(name = "FirstName")
private String firstName;
@Column(name = "FamilyName")
private String familyName;
@Column(name = "Email")
private String email;

public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

【问题讨论】:

  • 我不认为 Hibernate 允许您以您想要的方式命名主键。检查这个小旧帖子,但似乎仍然有用:link

标签: sql-server hibernate spring-boot jpa


【解决方案1】:

无法指定名称,但我认为可以通过覆盖

的自定义方言来普遍防止后缀

org.hibernate.dialect.Dialect#getAddPrimaryKeyConstraintString(String constraintName)

方法。

您不能对传入的名称做任何事情,但是您可以将其子串以删除后缀。

public class MyCustomSqlServerDialect extend SqlServer2012Dialect{

    @Override
    public String getAddPrimaryKeyConstraintString(String constraintName) {
        // default implementation
        // return " add constraint " + constraintName + " primary key ";

        return " add constraint " + 
                    constraintName.subString(0, constraintName.lastIndexOf("__")) +
                        " primary key "   
    }
}

那么显然只需在相关的 Spring/Hibernate 属性中设置这种方言。

【讨论】:

  • 谢谢艾伦。
  • 你确定 getAddPrimaryKeyConstraintString 可以覆盖吗?
  • 不幸的是,模式导出类没有使用该方法来创建主键。您还应该覆盖 StandardTableExporter(和 Dialect.getTableExporter 以返回您的表导出器)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
相关资源
最近更新 更多