one manytoone many foreignkey example enum java jpa clone

java - manytoone - jpa save one to one



ClonaciĆ³n de la entidad JPA (5)

Al usar EclipseLink, puede usar la muy útil función CopyGroup-Feature:

http://wiki.eclipse.org/EclipseLink/Examples/JPA/AttributeGroup#CopyGroup

Una gran ventaja es que sin mucho toquetear clona apropiadamente relaciones de propiedad privada, también.

Este es mi código, la clonación de una lista de reproducción con su propiedad privada @ OneToMany-relationship es una cuestión de pocas líneas:

public Playlist cloneEntity( EntityManager em ) { CopyGroup group = new CopyGroup(); group.setShouldResetPrimaryKey( true ); Playlist copy = (Playlist)em.unwrap( JpaEntityManager.class ).copy( this, group ); return copy; }

Asegúrese de utilizar persist () para guardar este nuevo objeto, merge () no funciona.

Tengo una entidad JPA ya persistida en la base de datos.
Me gustaría tener una copia (con una identificación diferente), con algunos campos modificados.

¿Cuál es la forma más fácil de hacer esto? Me gusta:

  • configurando su campo @Id como nulo y persistiendo, ¿funcionará?
  • ¿tendré que crear un método de clonación para la entidad (copiando todos los campos excepto el @Id)?
  • ¿Hay algún otro enfoque (como usar un marco de clonación)?

Como se menciona en los comentarios a la respuesta aceptada, detatch ignorará los cambios no eliminados en la entidad administrada. Si está utilizando la primavera tiene otra opción que es usar org.springframework.beans.BeanUtils

Aquí tiene BeanUtils.copyProperties(Object source, Object target) . Esto le permitirá hacer una copia completa sin alterar el entityManager.


Enfrentamos el mismo problema hoy: tengo una entidad en la base de datos y quiero:

  • obtenerlo de la base de datos
  • cambiar uno de sus atributos de valor
  • crear una copia de ella
  • modificar solo algunos atributos del clon
  • persistir clonar en la base de datos

Logré hacer los siguientes pasos:

@PersistenceContext(unitName = "...") private EntityManager entityManager; public void findUpdateCloneAndModify(int myEntityId) { // retrieve entity from database MyEntity myEntity = entityManager.find(MyEntity.class, myEntityId); // modify the entity myEntity.setAnAttribute(newValue); // update modification in database myEntity = entityManager.merge(myEntity); // detach entity to use it as a new entity (clone) entityManager.detach(myEntity); myEntity.setId(0); // modify detached entity myEntity.setAnotherAttribute(otherValue); // persist modified clone in database myEntity = entityManager.merge(myEntity); }

Observación : el último paso (persistencia de clonación) no funciona si utilizo ''persistir'' en lugar de ''fusionar'', incluso si noto en modo de depuración que la identificación de clon ha sido cambiada después del comando ''persistir''.

El problema que sigo enfrentando es que mi primera entidad no ha sido modificada antes de separarla.


Podría usar marcos de mapeo como Orika. http://orika-mapper.github.io/orika-docs/ Orika es un framework de mapeo de beans Java que copia recursivamente datos de un objeto a otro. Es fácil de configurar y proporciona varias flexibilidades también.

Así es como lo he usado en mi proyecto: agregó una dependencia:

<dependency> <groupId>ma.glasnost.orika</groupId> <artifactId>orika-core</artifactId> <version>1.4.6</version> </dependency>

A continuación, utilícelo en el código de la siguiente manera:

MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build(); MapperFacade mapper=mapperFactory.getMapperFacade(); User mappedUser = mapper.map(oldUser, User.class);

Esto podría ayudar si tiene muchos contenedores donde se necesita ese tipo de clonación.


Utilice EntityManager.detach . Hace que Bean ya no esté vinculado al EntityManager. A continuación, establezca Id en el Id nuevo (o nulo si es automático), cambie los campos que necesita y persista.