【问题标题】:@Enumerated(EnumType.STRING) generate int column instead of varchar@Enumerated(EnumType.STRING) 生成 int 列而不是 varchar
【发布时间】:2018-05-15 14:36:40
【问题描述】:

我正在使用带有 hibernate 和 ms Sqlserver 的 spring jpa。我有一个带有 @Enumerated(EnumType.STRING) 注释的枚举属性的实体。生成数据库模式时,用枚举值填充的列是 int 类型,而不是 char 类型。

设置数据库属性的Bean方法:

private Properties getHibernateProperties() {
    Properties properties = new Properties();
    properties.setProperty("hibernate.dialect","org.hibernate.dialect.SQLServer2012Dialect");

    properties.setProperty("hibernate.hbm2ddl.auto","create-drop");       
    properties.setProperty("ejb.naming_strategy","layer.controller.configuration.PhysicalNamingStrategyImpl");
    properties.setProperty("hibernate.search.default.directory_provider","filesystem");


    return properties;
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    vendorAdapter.setShowSql(Boolean.TRUE);        
    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
    factory.setJpaVendorAdapter(vendorAdapter);
    factory.setDataSource(dataSource());
    factory.setPackagesToScan("layer.domain","layer.application.security.authentication.entities");
    factory.setJpaProperties(getHibernateProperties());
    factory.afterPropertiesSet();

    return factory;
}

枚举和实体:

public enum Elenco {
    A,
    B,
    C,
    D;
}

@Entity
@Table(name="elenco")
public class ElencoClass extends BaseEntity<Long> {

    @Column(name="nomeECognome")
    private String nome;


    @Enumerated(EnumType.STRING)
    @Column(columnDefinition = "varchar")
    private Elenco ele;


    @Id
    @Column(name="id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Override
    protected Long getId() {
        return id;
    }

    @Override
    protected void setId(Long id) {

        super.id=id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public Elenco getEle() {
        return ele;
    }

    public void setEle(Elenco ele) {
        this.ele = ele;
    }
}

这是spring生成的表:

 CREATE TABLE [dbo].[elenco](
    [id] [bigint] IDENTITY(1,1) NOT NULL,
    [ele] [int] NULL,
    [nome] [varchar](255) NULL,

【问题讨论】:

  • 你有没有尝试把注解放到getter方法而不是字段上?
  • 感谢重播。是的,我有,但没有任何改变。
  • 还有一点,为什么要在columnDefinition 中提供列类型,而使用EnumType.STRING 指定数据类型,因为columnDefinition 会覆盖DDL。
  • 我尝试不使用 columnDefinition 但问题没有解决。
  • 这里相同,没有 columnDefinition="VARCHAR" 代码只是中断,因为 Hibernate 坚持使用 BIGINT,尽管 @Enumerated(EnumType.STRING)

标签: enums spring-data-jpa nhibernate-mapping


【解决方案1】:

如果您可以在 getter 方法上编写 @Enumerated(EnumType.STRING),那将有效。

【讨论】:

  • 必须添加 columnDefinition = "VARCHAR" 以使休眠停止抱怨。
【解决方案2】:

你试过吗?您仍然需要在 get 方法中指定列名而不是列定义的 @Column 注释。

@Enumerated(EnumType.STRING)
@Column(name="ele")
public Elenco getEle() {...}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2011-11-08
    • 2013-12-20
    • 2020-12-23
    • 2021-05-16
    相关资源
    最近更新 更多