Java @OneToMany表关系中的冗余行数据或实体
新闻组表中有多余的行。如何更改实体或查询以防止出现这种情况 模式:Java @OneToMany表关系中的冗余行数据或实体,java,jpa,orm,one-to-many,jpql,Java,Jpa,Orm,One To Many,Jpql,新闻组表中有多余的行。如何更改实体或查询以防止出现这种情况 模式: mysql> mysql> USE usenet;SHOW TABLES;DESCRIBE ARTICLE;DESCRIBE NEWSGROUP; Database changed +------------------+ | Tables_in_usenet | +------------------+ | ARTICLE | | NEWSGROUP | +------------
mysql>
mysql> USE usenet;SHOW TABLES;DESCRIBE ARTICLE;DESCRIBE NEWSGROUP;
Database changed
+------------------+
| Tables_in_usenet |
+------------------+
| ARTICLE |
| NEWSGROUP |
+------------------+
2 rows in set (0.00 sec)
+---------------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+------------+------+-----+---------+----------------+
| ID | bigint(20) | NO | PRI | NULL | auto_increment |
| MESSAGENUMBER | int(11) | YES | | NULL | |
| NEWSGROUP_ID | bigint(20) | YES | MUL | NULL | |
+---------------+------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| ID | bigint(20) | NO | PRI | NULL | auto_increment |
| NEWSGROUP | varchar(255) | YES | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql>
假设只与数据库建立一个连接,以使解决方案暂时保持简单,而我这样做的时候,可能有一种简单的方法假设“正确”的条件
该条款实体:
package net.bounceme.dur.usenet.model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.mail.Folder;
import javax.mail.Message;
import javax.persistence.*;
@Entity
public class Article implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column
private int messageNumber;
@ManyToOne(cascade = CascadeType.PERSIST)
private Newsgroup newsgroup;
public Article() {
}
public Article(Message message, Folder folder) {
messageNumber = message.getMessageNumber();
newsgroup = new Newsgroup(folder); //need to ensure uniqueness
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Article)) {
return false;
}
Article other = (Article) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "\nmessageNumber\t" + messageNumber;
}
public int getMessageNumber() {
return messageNumber;
}
public void setMessageNumber(int messageNumber) {
this.messageNumber = messageNumber;
}
}
And the Newsgroup entity:
package net.bounceme.dur.usenet.model;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.mail.Folder;
import javax.persistence.*;
@Entity
public class Newsgroup implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column //@Unique @UniqueConstraint interface..?
private String newsgroup;
@OneToMany(mappedBy = "newsgroup", cascade = CascadeType.PERSIST)
private Set<Article> articles = new HashSet<>();
public Newsgroup() {
}
public Newsgroup(Folder folder) {
newsgroup = folder.getFullName();//if row already exists, then what?
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Newsgroup)) {
return false;
}
Newsgroup other = (Newsgroup) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return newsgroup;
}
}
你的问题是你一直在浏览新闻组。。。当然,如果你保存了这篇文章,一个新的“reduntant”新闻组将被插入数据库,因为我没有ID 提示(希望如此): 在Articles Countstructor内部(或在Article类外部并将其添加)搜索要添加到文章中的新闻组 我的问题是。。。我不知道“文件夹”是什么,所以我只能给你一个提示:
Query query = entityManager.createNativeQuery("SELECT * FROM Newsgroup WHERE "dunno what you want to select here" = ?1",
Newsgroup.class);
query.setParameter(1, "your parameter);
Newsgroup group = (Newsgroup) query.getSingleResult();
如果新闻组为
null
请创建一个新的新闻组,否则请添加您找到的新闻组。我不确定您是否正确理解了您的问题。。你什么时候得到多余的行。。。保存一篇文章时?为什么/在哪里创建新的新闻组实体?@Jenson是的,每篇文章都会创建一个新的新闻组实体,而这只有在它是真正新的或唯一的新闻组时才会发生。然后,您必须在文章的构造函数中搜索要添加的新闻组->来自数据库(如果为空,则创建一个)@使用EntityManager类型查询进行Jenson搜索?这不会造成数据库连接问题吗?难道你不能用这种方法得到几十个潜在的递归连接吗?虽然,如果它适用于我的用例,那么它就足够了:)谢谢。我也在看,但我会试试看。该文件夹是javax.mail.folder,但您的答案是有意义的。
Query query = entityManager.createNativeQuery("SELECT * FROM Newsgroup WHERE "dunno what you want to select here" = ?1",
Newsgroup.class);
query.setParameter(1, "your parameter);
Newsgroup group = (Newsgroup) query.getSingleResult();