【发布时间】:2011-02-16 03:26:52
【问题描述】:
我有一个简单的实体 Code,我需要将其持久化到 MySQL 数据库中。
public class Code implements Serializable {
@Id
private String key;
private String description;
...getters and setters...
}
用户提供一个完整的文件,其中包含我读取的密钥、描述对,转换为代码对象,然后使用 em.merge(code) 插入单个事务中。该文件通常会有重复的条目,我首先在读取它们时将它们添加到键域上的映射中。
当键仅因大小写而异(例如:XYZ 和 XyZ)时,就会出现问题。当然,我的映射将包含这两个条目,但在合并过程中,MySQL 将这两个键视为相同,并且对合并的调用失败并出现 MySQLIntegrityConstraintViolationException。
我可以通过在读入这些键时将其大写来轻松解决此问题,但我想确切地了解出了什么问题。我得出的结论是 JPA 认为 XYZ 和 XyZ 是不同的键,但 MySQL 认为它们是相同的。因此,当 JPA 检查其已知键列表(或执行任何操作以确定是否需要执行插入或更新)时,它无法找到前一个插入并发出另一个插入,然后失败。这是正确的吗?除了更好地过滤客户端数据之外,还有其他方法吗?
我没有在 Code 类上定义 .equals 或 .hashCode 所以也许这就是问题所在。
【问题讨论】:
标签: java orm jpa merge persistence