¿Usar siempre envoltorios de objetos primitivos para JPA @Id en lugar del tipo primitivo?

He encontrado el problema con el uso del tipo primitivo como un objeto @Id para JPA junto con Spring Data JPA. Tengo una relación padre / hijo con Cascade.ALL en el lado de los padres, y el niño tiene PK, que al mismo tiempo también es FK de los padres.

class Parent {
    @Id
    private long id;

    @OneToOne(mappedBy = "parent", cascade = ALL)
    private Child child;
}

class Child {
    @Id
    @OneToOne
    private Parent parent;
}

Entonces, cuando corro:

...
Parent parent = new Parent();
Child child  = new Child(parent);
parent.setChild(child);  
em.persist(parent)
...

todo funciona bien Pero utilicé Spring Data JPA para persistir la entidad, así que ejecuté:

parentRepository.save(parent); // instead of em.persist(parent);

y este falló con la siguiente excepción:

Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: Parent

El problema fue que Spring Data JPAsalvar() El método verifica si la entidad es nueva, y si es nueva, entoncesem.persist () se usa de otra maneraem.merge () se utiliza

La parte interesante aquí es cómo Spring comprueba si la entidad es nueva o no:

getId(entity) == null;

Y, por supuesto, esto era falso, porque usé largo como el tipo para @Id, y el valor predeterminado para largo es 0. Cuando cambié mucho a Largo todo funciona también con Spring Data JPA.

Entonces, ¿es la práctica recomendada usar siempre envoltorios de objetos para los tipos primitivos (como Long en lugar de los largos) en lugar de los tipos primitivos? Cualquier recurso de terceros que describa esto como la práctica recomendada sería muy bueno.

Respuestas a la pregunta(2)

Su respuesta a la pregunta