【问题标题】:Adding a constraint to a JPA or Hibernate entity column using annotations使用注释向 JPA 或 Hibernate 实体列添加约束
【发布时间】:2011-04-04 21:24:39
【问题描述】:

我想要一个实体列,它只接受一组枚举值中的一个。例如,假设我有一个带有字符串列“petType”的 POJO/实体类“Pet”。我希望 petType 只允许以下三个值之一:“cat”、“dog”或“gorilla”。我将如何注释 getPetType() 方法以便创建一个数据库级别的约束来强制执行此操作?

我允许 Hibernate 在应用程序启动时通过将 Hibernate 属性“hbm2ddlauto”设置为“update”来创建或更新我的数据库表。

我尝试使用与@Type 注释关联的参数化用户类型,但这似乎没有对数据库列本身提供任何类型的约束。除了使用带有 columnDefinition 元素的一些 SQL 之外,似乎没有办法在 @Column 注释中指定这种约束,而且我犹豫要不要走这条路,因为似乎我使用的任何东西都不会跨平台/数据库独立(对我来说很重要,因为我在 Oracle 上运行我的生产代码,但我使用 HSQLDB 和 Derby 在本地进行测试)。也许我想做的事情不能简单地使用注释来完成。

提前感谢您就该主题提供的任何见解。

【问题讨论】:

  • 这里有同样的问题。令人惊讶的是似乎没有办法做到这一点?

标签: java hibernate orm annotations entity


【解决方案1】:

创建一个 PetType 类型的枚举并将您的映射定义为

@Enumerated(EnumType.STRING)

这样,字符串存储在数据库中,您的 java 枚举类型只接受您指定的 3 个值。

【讨论】:

  • 这在 Java/Hibernate 级别上工作得很好,但是当 Hibernate 创建/更新模式时,不会创建对数据库列的约束,所以我最终在数据库表中得到了一个不受约束的字符串列。如果将数据插入到我的 Hibernate 代码之外的表中,这是有问题的,因为可以将值插入到不是我指定的枚举值之一的列中。
猜你喜欢
  • 2010-09-21
  • 2014-09-28
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多