【问题标题】:How to persist but avoid unique keys exceptions?如何坚持但避免唯一键异常?
【发布时间】:2013-04-06 00:40:33
【问题描述】:

我的问题很简单:
一个user 有一个addressaddresscitystatecountry 组成。

所以我有这个结构:

public class User {
  ..
  //bi-directional many-to-one association to UserAddress
  @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
  @JoinColumn(name="id_user_address")
  private UserAddress userAddress;
  ..
}

请注意,CascadeType没有CascadeType.ALL,因为如果用户被删除,它不会影响创建的cities, states and countries

public class UserAddress {
  ..
    //bi-directional many-to-one association to AddressCity
    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.})
    @JoinColumn(name="id_city")
    private AddressCity addressCity;

    //bi-directional many-to-one association to AddressCountry
    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name="id_country")
    private AddressCountry addressCountry;

    //bi-directional many-to-one association to AddressState
    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name="id_state")
    private AddressState addressState;
  ..
}

我的问题是,如果我尝试注册一个具有相同 city 的用户,例如它会给我一个例外:

严重:原因:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:键“city_UNIQUE”的重复条目“Campinas”

如何避免这种constraint,保留CASCADE
有谁知道如何在我的 JSF 项目中显示 JPA 所做的查询?

【问题讨论】:

    标签: mysql jpa jpa-2.0


    【解决方案1】:

    User.userAddressCascadeType.PERSIST 注释导致 userAddress 被持久化每个 UserUserAddress.addressCityCascadeType.PERSIST 注释导致 addressCity 被持久化每个 UserAddress。因此,当您将用户保留在同一个城市时,会尝试使用相同的键来保留新城市,这会导致违反约束。所以删除那些 ManyToOne 注释关系的级联。

    您必须在保存用户时检查 userAddress 是否已经存在,并在保存 UserAddress 时检查其中的关系是否已经存在并采取必要的措施。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-16
      • 2014-03-29
      • 2017-02-10
      • 1970-01-01
      • 2012-08-18
      • 2021-07-14
      • 2010-09-29
      • 2016-09-15
      相关资源
      最近更新 更多