gpt4 book ai didi

java - @OneToMany 表关系中的冗余行数据或实体

转载 作者:行者123 更新时间:2023-12-01 15:14:42 25 4
gpt4 key购买 nike

我在 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>

假设与数据库的单个连接暂时保持解决方案简单,而我这样做 see that it's a complex topic ,大概有一种假设“正确”条件的简单方法。

文章实体:

    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;
}
}

如何先查询现有新闻组,而不是每次都创建新的新闻组实体?

NEWSGROUP 中的冗余行:

mysql> 
mysql> USE usenet;SELECT * FROM ARTICLE;SELECT * FROM NEWSGROUP;
Database changed
+----+---------------+--------------+
| ID | MESSAGENUMBER | NEWSGROUP_ID |
+----+---------------+--------------+
| 1 | 4 | 1 |
| 2 | 5 | 2 |
| 3 | 6 | 3 |
| 4 | 7 | 4 |
| 5 | 8 | 5 |
| 6 | 9 | 6 |
| 7 | 10 | 7 |
| 8 | 11 | 8 |
| 9 | 4 | 9 |
| 10 | 4 | 10 |
| 11 | 5 | 11 |
| 12 | 6 | 12 |
| 13 | 7 | 13 |
| 14 | 8 | 14 |
| 15 | 9 | 15 |
| 16 | 10 | 16 |
| 17 | 11 | 17 |
| 18 | 4 | 18 |
| 19 | 5 | 19 |
| 20 | 6 | 20 |
| 21 | 7 | 21 |
| 22 | 8 | 22 |
| 23 | 9 | 23 |
| 24 | 10 | 24 |
| 25 | 11 | 25 |
+----+---------------+--------------+
25 rows in set (0.00 sec)

+----+-------------------------------+
| ID | NEWSGROUP |
+----+-------------------------------+
| 1 | gwene.com.androidcentral |
| 2 | gwene.com.androidcentral |
| 3 | gwene.com.androidcentral |
| 4 | gwene.com.androidcentral |
| 5 | gwene.com.androidcentral |
| 6 | gwene.com.androidcentral |
| 7 | gwene.com.androidcentral |
| 8 | gwene.com.androidcentral |
| 9 | gwene.com.blogspot.emacsworld |
| 10 | gwene.com.blogspot.googlecode |
| 11 | gwene.com.blogspot.googlecode |
| 12 | gwene.com.blogspot.googlecode |
| 13 | gwene.com.blogspot.googlecode |
| 14 | gwene.com.blogspot.googlecode |
| 15 | gwene.com.blogspot.googlecode |
| 16 | gwene.com.blogspot.googlecode |
| 17 | gwene.com.blogspot.googlecode |
| 18 | gwene.com.economist |
| 19 | gwene.com.economist |
| 20 | gwene.com.economist |
| 21 | gwene.com.economist |
| 22 | gwene.com.economist |
| 23 | gwene.com.economist |
| 24 | gwene.com.economist |
| 25 | gwene.com.economist |
+----+-------------------------------+
25 rows in set (0.00 sec)

mysql>

最佳答案

你的问题是你的新闻组一直在消失......当然,如果你保存文章,一个新的“冗余”新闻组将被插入到数据库中,因为我没有ID。

提示(希望如此):

在文章计数结构内部(或在文章类外部并添加它)搜索要添加到文章中的新闻组。

我的问题是...我不知道那个“文件夹”是什么,所以我只能给你一个提示:

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,则创建一个新的新闻组,否则添加您找到的新闻组。

关于java - @OneToMany 表关系中的冗余行数据或实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11792587/

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