2012-08-03 46 views
0

我在NEWSGROUP表中獲取冗餘行。如何更改實體或查詢以防止這種情況發生?@OneToMany表關係中的冗餘行數據或實體

模式:

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

不是每次都創建一個新的新聞組的實體,我如何可以查詢現有的新聞組第一?新聞組

冗餘行:

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> 
+0

即時通訊不知道如果你明白你的問題正確..當你保存一篇文章時,你何時得到多餘的行...?爲什麼/你在哪裏創建新的NewsGroup實體? – Jenson 2012-08-03 09:10:04

+0

@Jenson是的,每篇文章都會創建一個**新的**新聞組實體,只有當它是一個真正新的或獨特的新聞組時纔會發生。 – Thufir 2012-08-03 09:13:32

+1

比您必須在文章的構造函數中搜索要添加的NewsGroup - >從數據庫(如果它爲空,創建一個) – Jenson 2012-08-03 09:16:48

回答

1

您的問題是,你的ceating新聞組所有的時間......當然,如果你保存文章,一個新的「reduntant」新聞組將被插入到數據庫,因爲我沒有身份證。

提示(希望):

章程Countstructor內搜索(或外部物件類別,並將其添加)爲您要添加到該條新聞組。

我的問題是...我不知道這是什麼「文件夾」是這樣我纔可以給ü一個提示:

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創建一個新的,otherwhise加你找到了一個。

+0

我也在看[刷新](http://stackoverflow.com/questions/836569/what-do-refresh-and-merge-mean-in-terms-of-databases),但我會嘗試。該文件夾是一個javax.mail.folder,但您的答案是有道理的。 – Thufir 2012-08-03 09:43:25