【问题标题】:Spring Hibernate create if not exists for child Objects如果子对象不存在,则 Spring Hibernate 创建
【发布时间】:2020-06-08 20:21:24
【问题描述】:

我遇到了一个关于使用 Spring Hibernate 保存子对象的问题,希望您能给我一个提示。已经在 Stackoverflow 上搜索过,但我找不到任何适合我的用例的东西。

我有两个班级:

Class File {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
  @JoinColumn(name = "format_id")
  private Format format;
}

Class Format {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @Column(name = "puid")
  private String puid;
}

当我读取给定的 XML 文件时..

<files>
    <file>
        <name>abc</name>
        <format>pdf</format>
    </file>
    <file>
        <name>xyz</name>
        <format>pdf</format>
    </file>
</files>

.. 我创建类文件的对象并相应地格式化。最后我会打电话给fileRepository.savaAll();

我的问题是,现在我的 mySQL 数据库中有两种格式,尽管它们是相同的。有没有办法(可能通过注释)只为子元素创建新的数据库元素,如果不存在(puid 应该是唯一的)。

我想避免手动遍历所有文件,获取格式并检查它是否已经存在。

谢谢

【问题讨论】:

    标签: java mysql hibernate spring-data-jpa


    【解决方案1】:

    我想避免手动遍历所有文件,获取格式并检查它是否已经存在。

    对于您当前的模型,这正是您需要做的:与其创建新的Format,不如加载它,并且仅在失败时创建一个新实例。 老实说,我不明白为什么不这样做对您来说如此重要,因为这似乎是一两行相当琐碎的代码。

    另一种方法是将Format 映射为嵌入式。 Here is a little tutorial 如果你需要的话,关于这个概念。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-25
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多