【问题标题】:Spring Boot Hibernate mapping set of enums to boolean columnsSpring Boot Hibernate 将枚举集映射到布尔列
【发布时间】:2019-10-30 10:17:28
【问题描述】:

我在 Spring Boot 应用程序中有一个 Form 实体:

@Data
@Entity
public class Form {
    @Id
    private String caseId;
    private String leadingUnit;
    private Set<Addiction> currentAddictions;
}

上瘾是一个枚举:

public enum Addiction {
  Alcohol, Nicotine, Drugs
}

我想将整个表单映射到数据库中的一个表。使用以下列: caseId、leadingUnit、currentAddictionsAlcohol、currentAddictionsNicotine 和 currentAddictionsDrugs。 我希望 currentAddictions* 列为布尔值,仅指示当前成瘾是否存在于集合中。我正在查看自定义用户类型,但我不知道该怎么做。有没有简单的解决方案?

【问题讨论】:

  • 您使用的是哪个数据库? currentAddictions 要在数据库中使用哪种数据类型
  • 我正在使用 postgresql,我想使用 bit 数据类型或其他任何表示布尔值的数据类型,即使是 0 和 1 的整数也可以。
  • 好的,1 caseid 可以有多个瘾,所以你能在一列中保存多个值吗,我建议再创建一个表 caseAddiction 与一对多关系

标签: java hibernate spring-boot nhibernate-mapping compositeusertype


【解决方案1】:

这感觉不对(将集合映射到布尔列)。但这里有一些选择。我认为这两个选项都需要将各个布尔值映射到实体类中。我想非常清楚:映射它的正确方法是有一个成瘾表,然后链接这些表。如果以后你想添加一个额外的瘾,这只是插入一个新行而不是改变数据库的结构。

  • 更改类的接口,为每个布尔值设置一个 get/set,然后每个 set 方法从 Set 中添加或删除未持久化的值。 Set 只能从 set 布尔方法修改。您可能需要在加载实体后使用@PostLoad 生命周期方法来填充集合。

  • 基本上相反:您只需使用几个帮助方法addAddiction(Addiction)removeAddiction(Addiction) 公开Set。这些方法在内部更新不以任何方式公开的布尔值。所以从类的界面来看,你只有一个Set

最后一个选项,但它有点高级的方法(所以更多的巫术),是使用CompositeUserType。您也可以在这里找到一些如何创建此类的示例:example 1example 2

我的建议是远离 CustomUserType,因为事情可能非常复杂,例如,如果您想使用 addiction = Alcohol 查询所有行。并且请考虑将成瘾映射到他们自己的桌子上。您未来的自己(或未来的维护者)会很感激它。

【讨论】:

  • 此表将仅用于神经网络。数据将在另一个表中保存和编辑。问题是我想在这个类中有一个用于乘法枚举的通用解决方案,你有什么想法吗?
  • 我仍然会为 Addictions 使用不同的表。这只是我的直觉,但我认为我提到的其他选项是将faster development now 交换为maintenance nightmare later。如果这是真正的一次性项目,您可以使用自定义CompositeUserType,但您需要编写相当多的反射来自动映射列(因为您需要映射自动枚举到列)。所以最后最好从一开始就使用不同的方法。
猜你喜欢
  • 2013-09-07
  • 2012-04-08
  • 1970-01-01
  • 2019-08-01
  • 2019-11-23
  • 2017-09-07
  • 2020-12-13
  • 2012-09-04
  • 1970-01-01
相关资源
最近更新 更多