- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 JPA 理解 @JoinTable 对 @OneToMany 关系的理解。我有上面的关系:
CLIENT
public class Client {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
...
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@JoinTable(name = "client_contact",
joinColumns = @JoinColumn(name = "client_id"),
foreignKey = @ForeignKey(name = "fk_client_contact__client"),
inverseJoinColumns = @JoinColumn(name = "contact_id"),
inverseForeignKey = @ForeignKey(name = "fk_client_contact__contact"))
private Set<Contact> contactNumbers;
}
CONTACT
public class Contact {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String description;
private String number;
}
Problem Description
我的问题是:我可以创建一个包含任意多个联系人的客户端,我可以删除联系人,但是当我尝试更新客户端的一个联系人或在创建客户端后添加一个联系人时,我'我收到以下外键错误:
Caused by: org.h2.jdbc.JdbcSQLException: Unique index or primary key violation: "PRIMARY_KEY_4 ON PUBLIC.CLIENT_CONTACT(CLIENT_ID, CONTACT_ID) VALUES ( /* key:3 */ 97, 194)"; SQL statement:
insert into client_contact (client_id, contact_id) values (?, ?) [23505-175]
我觉得 hibernate 正在尝试在 joinTable 中重新插入联系人,我做错了什么? *我正在使用 entityManager.merge()
更新实体。
我正在使用 Hibernate 5.1.0、JPA 2.1。
我试图避免使用没有 JoinTable 的 mappedBy 或 JPA 2.1 @OneToMany 关系,因为我还有其他包含联系人的实体
最佳答案
您必须重新定义实体中的 hashcode 和 equals 方法。
来自 Oracle 文档 https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html
The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true).
Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.
现在让我们看看如果您尝试这种情况会发生什么:
Client client = new Client();
entityManager.persist(client);
Contact contact = new Contact();
entityManager.persist(contact);
client.getContacts.add(contact);
entityManager.merge(client);
Contact contact2 =entityManager.find(Contact.class,contact.getId());
//and now Unique index or primary key violation will appear
//because you are using the default equals and hashcode implementation
//adding contact2 will not replace the old one
client.getClients().add(client2);
entityManager.merge(client);//Unique index or primary key violation
为避免这种情况,您必须为您的 jpa 实体实现 Equals 和 HashCode。
查看这些链接 https://vladmihalcea.com/hibernate-facts-equals-and-hashcode/和 The JPA hashCode() / equals() dilemma
关于java - @JoinTable 更新时出现外键错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38885866/
尝试实现 this question 的解决方案我想知道,在使用 @JoinTable 注释时有什么方法可以使用 WHERE 子句。如果您查看问题(只需跳到表格布局),我会将这两个表格与 USER_I
这是我的示例数据模型 我已经声明了以下类: @Entity({ name: 'user' }) export class User { @Column({ type: 'int4' })
如果一个域类具有复合 id,grails/gorm 似乎会忽略多对多关系连接表上的列名,例如: class Following implements Serializable { ...
我正在尝试使用 JPA 理解 @JoinTable 对 @OneToMany 关系的理解。我有上面的关系: CLIENT public class Client { @Id @Colu
如何使用@JoinTable连接三个表? 我有三个表: user: id, name post: id, date company: id, name 我想创建一个包含以下列的新表: user_id,
使用 JPA/Hibernate 3.6/DB2。 我有以下异常:Caused by: org.hibernate.AnnotationException: SecondaryTable JoinCo
我在hibernate中理解了@joincolumn。现在我开始使用@JoinTable。以下是我的 POJO @Entity @Table(name = "person") public class
我目前正在开发一个有 2 个表的应用程序。用户和团队。用户将 UserId 作为 PK 和 UserPassword。 Team 表将 TeamId 作为 PK 和 TeamName。 最初我只有一个
如何创建高效的 JPA Criteria 查询以仅在连接表中存在实体时选择实体列表?以下面三个表为例: create table user (user_id int, lastname varchar
嗨,我遇到了 JPA 速度慢的问题。使用 jps 映射队列模型、队列快照和事件。 这是我的实体: @Entity @Table(name = "cmEvent") public class Event
我使用的是 MySQL 5.5、JPA 2.0 和 Hibernate 4.1.0.Final。我的实体中有这个字段...... @Entity @Table(name = "teacher",
我在媒体和标签之间有多对多的关系: 中等: @ManyToMany(fetch=FetchType.EAGER) @IndexColumn(name="tags_index_column") @Joi
我正在尝试在 Hibernate 中运行一个简单的 JoinTable 操作,它让我感到不舒服。我有一张表代表一个名为“Person”的实体。我有另一个代表社会安全号码的表(例如)。我希望将社会安全号
我已经阅读了很多文章和文档,并且一定缺少一些内容。 在我的应用程序(下面的模型)中,我遇到了一个数据问题,这似乎超出了我的控制范围,在联接表JOBORDERCATEGORIES中有一个category
我的模型(示例)如下: CREATE TABLE person ( id INT PRIMARY KEY, name TEXT ... ); CREATE TABLE team ( i
我有以下两个实体和一个连接表: 实体: @Entity @Table(name = "PERSON") public class parent { @OneToOne(mappedBy="person
我有一个 Tag 类,它使用 TagStatus 连接表存储对状态集的引用,目前系统中没有它的实体 package com.iit.awt.application.domain; import jav
我正在尝试创建一个调查。该调查由一系列问题组成。每个问题又由答案值的集合组成。 我已将问题与调查联系起来,如下所示: @OneToMany() @JoinTable( name = "
我有 3 个表: 业务角色 标识符 姓名 BusinessRole_ActorType(链接表) 角色标识符 actorType_identifier Actor 类型 标识符 名称(varchar)
我花了几个小时四处搜索,但没有发现任何与我的情况相似的东西。 让我们假设遵循多对多数据模型: Contract (any business entity)- contract_id- other fi
我是一名优秀的程序员,十分优秀!