2016-07-29 8 views
0

Ich habe einige Entity zum Beispiel UserWie Liste <Entity> in neue Liste ohne ID kopieren?

class User{ 
private Long id; 
private String Name; 
private List<Role> roles; 
} 

Wenn ich diesen Benutzer von DB erhalten Ich habe user = UserDao.getUser(1);

und ich habe einige List<Role> someList;

ich kopieren müssen user.getRoles() zu someList

Aber wenn ich schreibe user = user.getRoles() alle Role Objekte in someList habe ID nicht null;

Ich möchte someList zu einem anderen Benutzer setzen, aber wenn ID nicht null ist, kann ich es nicht verwenden.

kann ich diese

for (Role role: user.getRoles()) { 
      role.setId(null); 
      someList.add(role); 
     } 

machen, aber ich denke, es ist eine schlechte Praxis ist. Vielleicht kennst du den besten Weg?

+0

Können Sie uns mehr vollständigen Code liefern zu verstehen, was Sie anstreben? Das verstehe ich nicht ganz. – TMichelsen

Antwort

1

Vorausgesetzt, dass Sie in einer Transaktion sind und dass wollen nicht die Role Objekte über verschiedene Benutzer wieder zu verwenden: Mit der Art und Weise funktioniert überwintern, werden Sie neue Rolle Objekte erstellen müssen, sonst wird Hibernate wissen, dass Sie die zugewiesene gleiche Instanz zu einem anderen Objekt und ignoriert vollständig, dass Sie die ID auf null gesetzt haben.

Persönlich würde ich denke, würde eine statische Methode in Role Klasse namens clone erstellen, die eine Liste von Rollen erhält und neue (ohne eine ID) instanziiert.

Die große, wichtige Frage lautet: Wollen Sie die Rollenobjekte wirklich nicht wiederverwenden? Und möglicherweise zwei Rollen mit den gleichen Daten, aber nur verschiedenen Benutzern zugewiesen (das könnte gegen die dritte Normalform gehen ... aber das hängt von Ihren Anforderungen ab).

+0

eigentlich ist mein Problem ein wenig anders. Der Benutzer ist nur ein Beispiel. Wenn Sie das Bearbeitungsformular öffnen, muss ich, auch wenn sich etwas geändert hat, eine Kopie des Objekts erstellen und ihm eine neue Version zuweisen. rette auch das alte Objekt. dh aktualisieren Sie das Objekt nicht und kopieren Sie es. aber diese Eigenschaft enthält die zwei Listen mit anderen Objekten – user5620472

+0

Cool! :) Was ich oben geschrieben habe, sollte den Trick machen. – Augusto

+0

Können Sie ein Beispiel weitergeben, das Sie empfohlen haben? – user5620472

0

Hier ist ein Beispiel. Ich habe die Rolle der Klasse selbst auf, da Sie keine Quellcode es vorsah:

public class Role { 
    private int id; 
    private String someAttribute; 
    private int otherAttribute; 

    public Role(String someAttribute, int otherAttribute) { 
     this.someAttribute = someAttribute; 
     this.otherAttribute = otherAttribute; 
    } 

    // Other class methods omited for readability 

    public Role clone() { 
     return new Role(someAttribute, otherAttribute); 
    } 

} 

Edit: Und Sie könnten Ihre for-Schleife wie folgt tun:

for (Role role: user.getRoles()) { 
    someList.add(role.clone()); 
} 
Verwandte Themen