- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 Hibernate 相当陌生,不完全理解应该如何继续更新中间表。
我在两个表之间有多对多关系: session 和出版物
POJO Publication.class:
private List<Conference> conferences;
...
@ManyToMany(targetEntity = Conference.class, cascade = { CascadeType.PERSIST,
CascadeType.MERGE })
@JoinTable(name = "publications_conferences", joinColumns = @JoinColumn(name = "Publications_id"), inverseJoinColumns = @JoinColumn(name = "Conferences_id"))
public List<Conference> getConferences() {
return conferences;
}
public void setConferences(List<Conference> conferences) {
this.conferences = conferences;
}
POJO Conference.class:
private List<Publication> publications;
...
@ManyToMany(targetEntity = Publication.class, mappedBy = "conferences")
public List<Publication> getPublications() {
return publications;
}
public void setPublications(List<Publication> publications) {
this.publications = publications;
}
我的表“conferences”包含重复的记录。我的代码检查两个 session a,b 是否具有相似的标题并删除 a 或 b。现在,我不想删除中间表中的引用(以及记录),而是想以这种方式更新它:
删除 session “b”之前:
|Publications_id|Conferences_id
-------------------------------
c | a
d | b
删除 session “d”后:
|Publications_id|Conferences_id
-------------------------------
c | a
d | a <----- update reference
我尝试了以下代码:
if (answer == 2) {
deleteConferenceQ.setParameter("confId", confIdB);
for (Publication pubB : publicationsB) {
publicationsA.add(pubB);
pubB.getConferences().add(a);
session.save(pubB);
}
int result = deleteConferenceQ.executeUpdate();
tx.commit();
}
但是我收到org.hibernate.HibernateException:非法尝试将集合与两个打开的 session 关联
。因此我想知道我的做法是否正确。
编辑#1:我用以下代码替换了以前的代码:
如果(答案==2){
Iterator<Publication> pubBIter = publicationsB.iterator();
while (pubBIter.hasNext()) {
Publication pubB = pubBIter.next();
pubBIter.remove();
pubB.getConferences().remove(b);
b.getPublications().remove(pubB);
pubB.getConferences().add(a);
publicationsB.add(pubB);
}
session.save(a);
session.delete(b);
}
我在 session.save(obj)
上仍然有之前的异常
有人可以帮我吗?谢谢
最佳答案
从 JPA/Hibernate 的角度来看,您甚至不应该考虑连接表。您只需要维护 @ManyToMany
关系的双方并让 Hibernate 管理数据库即可。在您的情况下,它应该归结为从连接表中删除一行并添加一行。您的代码应该如下所示
Publication pub = ...;
Conference confToBeRemoved = ...;
Conference confToBeAdded = ...;
pub.getConferences().remove(confToBeRemoved); // this implies equals() and hashcode() are properly implemented
confToBeRemoved.getPublications().remove(pub); // same here
pub.getConferences().add(confToBeAdded);
confToBeAdded.getPublications().add(pub);
// save all
关于java - hibernate : Update many-tomany intermediary table on Delete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30240981/
我有一个中间 java web 服务应用程序(使用 Spark Java 构建 - 但这是偶然的),它接受一个 http 参数 - 从它生成一个 URL - 调用该 URL,然后将结果返回给原始调用者
假设我有 struct Transformable { virtual void mirror()=0; } class Shape: public Transformable { P
你好真棒人! 这样的问题,我已经做了很多搜索。我在两 (2) 个月前完成了网站的构建,但今天团队决定在 ManyToManyField() 中每次将实例添加到模型中时进行跟踪字段。 我正在考虑使用 t
我对 Hibernate 相当陌生,不完全理解应该如何继续更新中间表。 我在两个表之间有多对多关系: session 和出版物 POJO Publication.class: private List
(见底部更新) 所以,我有两个对象(我们称它们为 ClassA 和 ClassB),它们表现出多对多关系(ClassA 可以有多个 ClassB 对象,反之亦然)。 与传统的多对多不同,实际的“关系”
我有 3 个表:users、courses 和 courseusers。 Courseusers 是连接 courses.idCourse 和 users.idUser 的中间表。但是,中间表没有外键
我是一名优秀的程序员,十分优秀!