【问题标题】:Hibernate, Cascaded operations, Duplicates休眠,级联操作,重复
【发布时间】:2015-08-07 13:42:53
【问题描述】:

我在 2 个表 Person 和 Address 与中间表 Person_Address 之间存在多对多关系。我有这些实体的 Daos 和服务

我想要的是当一个人被添加一个地址列表时,如果地址已经存在于数据库系统中,那么应该将这些地址的 id 添加到 Person_Address 表中。

会发生具有不同 ID 的重复值。

这样做的可能方法是在添加之前检查数据库,但如果我这样做,那么我将编写自己的 SQL 查询而不是休眠。有没有办法让我在hibernate中实现我的目标?

人物类

@Entity
@Table(name = "PERSON")
public class Person {

    @Id
    @Column(name = "personID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;
    private String surName;
    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(name = "PERSON_ADDRESS", joinColumns = {
        @JoinColumn(name = "PERSONID")}, inverseJoinColumns = {
        @JoinColumn(name = "ADDRESSID")})
    private List<Address> addresses = new ArrayList<>();

地址类

@Entity
@Table(name = "ADDRESS")
public class Address {

    @Id
    @Column(name = "addressID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @ManyToMany(cascade = CascadeType.ALL, mappedBy = "addresses")
    private List<Person> residents;
    private String street;
    private String state;
    private String country;
    private String postCode;

【问题讨论】:

  • 据我所知,没有办法做到这一点。如果您在没有“id”的情况下传入一个实体进行持久化,它将获得一个新实体。因此,如果您向 Person 提供一个已经存在的地址,请确保该地址有一个 id。

标签: java mysql hibernate


【解决方案1】:

如果实体没有 ID。 Hibernate 创建不同的更新。

您应该在前端使用地址预填充。或者在保存之前使用 Criteria API 搜索输入的地址

【讨论】:

    【解决方案2】:

    也许一种解决方案是更改您的数据库并将完整地址设置为主键,您可以通过连接其他字段来获取它。为确保地址相同,我认为您必须将其格式化为小写或大写。 因此,当您输入地址时,它将是主键,并且您不会有重复的数据。

    【讨论】:

      猜你喜欢
      • 2010-12-31
      • 2019-12-24
      • 2010-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      相关资源
      最近更新 更多