gpt4 book ai didi

mysql - 如何坚持但避免唯一键异常?

转载 作者:行者123 更新时间:2023-11-29 13:56:03 25 4
gpt4 key购买 nike

我的问题很简单:
一个user有一个 address , addresscity 组成, statecountry .

因此我有这样的结构:

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 的用户例如,它给了我一个异常(exception):

SEVERE: Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'Campinas' for key 'city_UNIQUE'

如何避免这种constraint ,保留 CASCADE
有人知道如何在我的 JSF 项目中显示 JPA 发出的查询吗?

最佳答案

User.userAddressCascadeType.PERSIST 注释会导致每个 User 持久保存 userAddress,并且UserAddress.addressCityCascadeType.PERSIST 注释会导致每个 UserAddress 持久保存 addressCity。因此,当您保留具有相同城市的用户时,会尝试使用相同的 key 来保留新城市,这会导致违反约束。因此,请删除那些 ManyToOne 带注释的关系的级联。

您必须在保存 User 时检查 userAddress 是否已存在,并在保存 UserAddress 时检查其中的关系是否已存在并采取所需的操作。

关于mysql - 如何坚持但避免唯一键异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15845743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com