【问题标题】:Avoiding "columnDefinition" attribute in @Column annotation in hibernate避免休眠中@Column注释中的“columnDefinition”属性
【发布时间】:2013-10-21 22:50:08
【问题描述】:

有没有办法避免hibernate中@Column注解的columnDefinition属性?
假设我在数据库中的表中有一个列,它被定义为 enum('US', 'IN', 'GB', 'DE'etc) 即 enum of all country codes 。我将它映射到使用休眠注释表示表的 java 类中的属性“country_code”。但是没有定义 columnDefinition 休眠会抛出一个异常说
org.hibernate.HibernateException:country_code 的列类型错误。找到枚举,应为 varchar。

有没有办法避免@Column注解中的columnDefinition属性?
例如:

private UserType userType;
@Column(name="user_type")
@Enumerated(EnumType.STRING)
public UserType getUserType() {
    return userType;
}

public void setUserType(UserType userType) {
    this.userType = userType;
}

当我使用这个映射运行应用程序时,它会抛出一个异常:

org.hibernate.HibernateException: Wrong column type in gobe_user_db.gobe_User for column user_type. Found: enum, expected: varchar(255)

但是,当我将“columnDefinition="enum('abc', 'xyz')”添加到@Column 属性时,它会起作用。

【问题讨论】:

  • 请发布一些代码。你的问题我不清楚...
  • 映射到数据库中枚举的标准方法是在 Java 代码中使用枚举。您是否尝试映射到 java 代码中的字符串?
  • 我只映射到枚举。但是如果@Column 注释中没有 columnDefinition 属性,则会引发异常。

标签: java mysql hibernate hibernate-mapping


【解决方案1】:

您指定的代码缺少定义,希望这能解决问题。

   public enum EmployeeStatus {FULL_TIME, PART_TIME, CONTRACT}

   public enum SalaryRate {JUNIOR, SENIOR, MANAGER, EXECUTIVE}

   @Entity public class Employee {
       public EmployeeStatus getStatus() {...}
       ...
       @Enumerated(STRING)
       public SalaryRate getPayScale() {...}
       ...
   }

查看here 的示例

【讨论】:

  • 嗨,我知道如何将字符串映射到枚举。但问题是如果 mysql 数据库中的列的类型为“enum('abc', 'cde')”,那么 columnDefinition 属性在 Column 注释中是强制性的。我想知道是否有办法避免Column注释中的“columnDefinition”属性?
  • 据我所知,没有办法这样做,因为从表返回的值必须设置为变量,并且该变量必须包含类型。类型定义不仅是 int、string char 等,而且所有其他类型(如 enum、Class 等)都对变量做同样的事情。即;告诉编译器该变量是一个指定类型的对象,它遵循在其相应类中定义的特定顺序,即 String Integer 等。希望你理解。
【解决方案2】:

您错过了@Enumerated(EnumType.STRING),请与@Column一起使用

【讨论】:

  • 您好,我已经发布了代码。我已将其映射到@Enumerated(EnumType.String)。但它仍然会抛出异常。
猜你喜欢
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2023-03-17
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多