0

我的问题很简单:
Auseraddress,addresscity,state和组成country

所以为此我有这个结构:

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 所做的查询?

4

1 回答 1

1

对于每个持久化的要持久化的原因的注释和对于每个持久化CascadeType.PERSIST的要持久化的原因的注释。因此,当您将用户保留在同一个城市时,会尝试使用相同的键来保留新城市,这会导致违反约束。所以删除那些 ManyToOne 注释关系的级联。User.userAddressuserAddressUserCascadeType.PERSISTUserAddress.addressCityaddressCityUserAddress

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

于 2013-04-06T07:05:26.533 回答