Uso un db relazionale utilizzando una singola colonna pk con alcune tabelle nidificate. Devo aggiungere una semplice archiviazione al mio progetto. L'archiviazione avviene solo quando l'applicazione raggiunge uno stato particolare, quindi quello che speravo di fare era copiare il mio oggetto di ibernazione esistente in una nuova istanza in cui la nuova istanza sarebbe stata salvata con un nuovo ID lasciando intatto l'oggetto esistente. Non riesco a capire come copiare l'oggetto esistente in una nuova istanza senza dover manualmente impostare ogni singolo nuovo campo dell'istanza. Qualcuno sa di un modo semplice per farlo?ibernare i valori degli oggetti di copia nel nuovo oggetto con il nuovo ID generato
risposta
Sto anche lavorando con Hibernate e ho ottenuto lo stesso requisito che hai ottenuto. Quello che ho seguito è stato quello di implementare Cloneable
. Di seguito è riportato un esempio di codice su come farlo.
class Person implements Cloneable {
private String firstName;
private String lastName;
public Object clone() {
Person obj = new Person();
obj.setFirstName(this.firstName);
obj.setLastName(this.lastName);
return obj;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
Oppure potresti andare a una soluzione basata su riflessione ma non lo consiglio. Controlla questo website per maggiori dettagli.
È possibile clonare l'oggetto e cancellare l'ID e salvarlo nuovamente in modo da assegnare un nuovo ID.
così
Person person = EmployeeDAO.get(empId);
Person newPersonCopy = person.createCopyWithNoId()
EmployeeDAO.add(newPersonCopy);
in questo caso il createCopyWithNoId() creerebbe un clone dell'oggetto e impostare il campo Id null. quando ora aggiungi il nuovo clone, il motore di ibernazione lo vedrà come un nuovo oggetto lo manterrà e il database assegnerà una nuova chiave primaria.
Si noti che ho evitato di chiamare il metodo clone perché ciò che viene fuori non è un clone esatto mentre manipoliamo l'Id (impostandolo su null);
Un altro modo per andare sarebbe quello di aggiungere un costruttore che ha preso un oggetto di tipo persona e ha creato un nuovo oggetto ma semplicemente non ha impostato il campo ID lasciandolo al suo valore predefinito di null. Anche in questo caso si continua a utilizzare il DAO.
Potrebbe elaborare un po 'di più su questo. Non sono completamente sicuro di cosa sia CreateCopyWithNoId. Penso che sia qui che ho bisogno di chiarimenti. Inoltre, questo potrebbe eseguire un clone profondo? –
O è possibile clonare se l'oggetto è clonabile oppure è possibile definire un metodo/costruttore per l'oggetto che si desidera copiare prendendo un parametro di se stesso e copiando tutto ciò che è necessario, in una nuova istanza e restituendolo all'utente.
Basta recuperare l'oggetto, staccarlo, impostare l'id su null e mantenerlo.
MyEntity clone = entityManager.find(MyEntity.class, ID);
entityManager.detach(clone);
clone.setId(null);
entityManager.persist(clone);
Se l'oggetto hanno rapporti OneToMany, si dovrà ripetere l'operazione per tutti i bambini, ma impostando l'oggetto id genitore (generato dopo la chiamata persist
) invece di null.
Ovviamente sarà necessario rimuovere qualsiasi CASCADE persist
sulle tue relazioni OneToMany, altrimenti il tuo persistente creerà i duplicati di tutti i bambini negli errori di DB o fk constraint.
funziona come previsto –
mi aspettavo che questo approccio funzionasse ma .... sorpresa, sorpresa I un'eccezione org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke() quando provo a reimpostare l'id – Legna
su un bambino? Lo hai staccato bef minerale? (il distacco non è ricorsivo a meno che con cascadeType = DETACH) – Gab
Dai un'occhiata al seguente link. uno dei più potente meccanismo di clonazione che possono essere utilizzati in modo più efficace con Hibernate
http://thoughtfulsoftware.blogspot.in/2013/05/using-variable-depth-copy-to-prevent.html
- 1. Imposta nuovo ID con jQuery
- 2. Copia genitore MySQL e tutti i record figlio correlati nel database in un nuovo ID
- 3. Copia il numero dell'elenco puntato nel nuovo documento?
- 4. Come creare un nuovo tag img con JQuery, con src e id da un oggetto JavaScript?
- 5. mysql_field_name nel nuovo mysqli
- 6. jQuery .clone .insertAfter con un nuovo ID
- 7. Linq selezionare al nuovo oggetto
- 8. nuovo oggetto {} Costruire
- 9. Nuovo ID entità nell'evento di dominio
- 10. LINQ selezionare il nuovo oggetto, impostare i valori dell'oggetto nella funzione
- 11. Usando 'ritorno' per la creazione di oggetti con 'nuovo'
- 12. oggetti istanziare senza utilizzare nuovo operatore
- 13. Java - copia di oggetti arraylist
- 14. Come copiare i valori degli oggetti superclasse nella sottoclasse dei valori degli oggetti?
- 15. Nuovo oggetto Mysqli è Null
- 16. Oggetto selenio Riutilizzo degli oggetti
- 17. Ottenere i nomi degli oggetti dall'enumerazione con più valori zero
- 18. Restituzione di un nuovo oggetto con un altro valore
- 19. (Nuovo oggetto()). Metodo() in VB.net
- 20. non creare un oggetto con il nuovo Costruttore
- 21. Copia JsonSerializerSettings da JsonSerializer a nuovo JsonSerializer
- 22. vita di un nuovo oggetto senza riferimento
- 23. inizializzare un nuovo oggetto dalla classe Enum
- 24. Passa attraverso ogni nuovo oggetto da Costruttore
- 25. Crea nuovo Dataframe con valori di campo vuoto/nullo
- 26. Passare oggetto come parametro alla funzione di costruzione e copiare le sue proprietà nel nuovo oggetto?
- 27. Ottieni oggetto con id()?
- 28. avvio di un nuovo thread nel servlet
- 29. Come impostare un ID personalizzato quando si spinge un nuovo oggetto in Firebase
- 30. Aggiornare un nuovo campo nel documento esistente
Come gestisci le tabelle nidificate come oneToMany's etc? Avevo paura di dover impostare nuovamente tutte le variabili oggetto.:( –
Il mio caso non riguardava oggetti nidificati quindi non ho affrontato il problema ... temo che dovrai copiare in profondità ... C'è sempre una generazione che può essere fatta ... – Chan
Puoi indicarmi a un articolo sulla generazione? –