2016-08-29 5 views
0

I 2 Tabellen email_address undHibernate Mapping-Liste innerhalb Liste

enter image description here

enter image description here

ich eine Liste von E-Mail-Adressen group_email erhalten möchten und wenn es Gruppe ist auch die E-Mails der Gruppenliste. Hier ist meine Hibernate dom Objekt:

@Entity 
@Table(name = "email_address") 
public class EmailAddressDom { 

@Id 
@Column(name = "id") 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "email_address_id_seq") 
@SequenceGenerator(name = "email_address_id_seq", sequenceName = "email_address_id_seq") 
private int id; 

@Column(name = "name") 
private String name; 

@Column(name = "email") 
private String email; 

@Column(name = "is_group") 
private boolean isGroup; 

@Column(name = "status") 
private boolean status; 
// Getters and setters 

Und hier ist die Umsetzung, wie erhalte ich die Liste

public List<EmailAddressDom> getEmailAddresses() { 
    Session session = getCurrentSession(); 
    Criteria criteria = session.createCriteria(EmailAddressDom.class); 
    List<EmailAddressDom> emailAddresses = criteria.list(); 
    return emailAddresses; 
} 

Und das Ergebnis ist

[ 
    { 
    "id": 451, 
    "name": "HS", 
    "isGroup": true, 
    "status": true 
    }, 
    { 
    "id": 452, 
    "name": "test4", 
    "email": "[email protected]", 
    "isGroup": false, 
    "status": true 
    }, 
    { 
    "id": 450, 
    "name": "test3", 
    "email": "[email protected]", 
    "isGroup": false, 
    "status": true 
    }, 
    { 
    "id": 402, 
    "name": "test2", 
    "email": "[email protected]", 
    "isGroup": false, 
    "status": true 
    }, 
    { 
    "id": 401, 
    "name": "test1", 
    "email": "[email protected]", 
    "isGroup": false, 
    "status": true 
    } 
] 

Ich möchte wie dieses Ergebnis erhalten

[ 
    { 
     "id":451, 
     "name":"HS", 
     "isGroup":true, 
     "status":true, 
     "groupEmails":[ 
     { 
      "id":450, 
      "name":"test3", 
      "email":"[email protected]", 
      "isGroup":false, 
      "status":true 
     }, 
     { 
      "id":452, 
      "name":"test4", 
      "email":"[email protected]", 
      "isGroup":false, 
      "status":true 
     } 
     ] 
    }, 
    { 
     "id":402, 
     "name":"test2", 
     "email":"[email protected]", 
     "isGroup":false, 
     "status":true 
    } 
] 

Welche Zuordnung sollte ich in der Entität EmailAddressDom verwenden?

ich eine einfache Anwendungszuordnung wie folgt geschrieben wurden entsprechend Kommentaren aktualisiert und es funktioniert gut

@ManyToMany(fetch= FetchType.EAGER, cascade={CascadeType.ALL}) 
    @JoinTable(name="group_email", 
     joinColumns={@JoinColumn(name="group_id")}, 
     inverseJoinColumns={@JoinColumn(name="email_addr_id")}) 
private List<EmailAddressDom> groupEmails; 

Aber ich habe verwirrt es in meiner Web-Anwendung einstellen, wirft es folgende Ausnahme :

Association has already been visited: AssociationKey(table=group_email, columns={email_addr_id}) 

Was kann der Grund sein?

+3

Das DB-Struktur ganz schrecklich ... – meskobalazs

Antwort

0

Um sich selbst zu kommen, in Ihrem EmailAddressDom Klasse hinzufügen Referenz auf sich selbst wie zu erreichen:

@OneToMany(fetch = FetchType.LAZY) 
    @JoinTable(name = "group_email", 
     joinColumns = @JoinColumn(name = "email_addr_id", referencedColumnName = "id"), 
     [email protected](name="group_id", referencedColumnName="id")) 
    private List<EmailAddressDom> emailAddressDoms; 

In group_email Tabelle, die Sie benötigen keine id Spalte als email_addr_id und group_id Kombination einzigartig wäre oder haben Sie gleiche E-Mail mehr erlauben als einmal in einer Gruppe?

Aktualisierung nach Kommentar von OP: Um nach E-Mail-Gruppen zu gruppieren, ändern Sie die Zuordnung wie unten gezeigt.

@ManyToOne(fetch = FetchType.LAZY) 
    @JoinTable(name = "group_email", 
     joinColumns = @JoinColumn(name="group_id", referencedColumnName="id"), 
     [email protected](name = "email_addr_id", referencedColumnName = "id")) 
    private List<EmailAddressDom> emailAddressDoms; 
+0

E-Mail-Adresse kann in einem sein Gruppe einmal – Lusi

+0

Dann benötigen Sie die ID-Spalte in der Group_email-Tabelle nicht. – Rohit

+0

Danke Rohit für deine Antwort.Ich habe versucht, aber ich habe folgendes Ergebnis: [ { "id": 451, "name": "HS", "IsGroup": true, "Status": true, "groupEmails": [ ] }, { "id": 452, "name": "test4", "E-Mail": "[email protected]", "IsGroup": false, "Status": true, "groupEmails": [{ "id": 451, "name": "HS", "IsGroup": true, "Status": true, "groupEmails": [] } ] }, ......... ] – Lusi

0

Sie entweder Eager Laden

@OneToMany(fetch = FetchType.EAGER) 
    @JoinTable(name = "group_email", 
     joinColumns = @JoinColumn(name = "email_addr_id", referencedColumnName = "id"), 
     [email protected](name="group_id", referencedColumnName="id")) 
    private List<EmailAddressDom> emailAddressDoms; 

ODER

// explizit Kriterien beitreten

public List<EmailAddressDom> getEmailAddresses() { 
Session session = getCurrentSession(); 
Criteria criteria = session.createCriteria(EmailAddressDom.class); 
criteria.setFetchMode("emailAddressDoms", fetchMode.JOIN); 
List<EmailAddressDom> emailAddresses = criteria.list(); 
return emailAddresses; 

}