Me enfrento durante horas con un procedimiento extraño en Spring Boot cuando intento guardar una entidad mapeada.

La clase de entidad con una clave compuesta que debe configurar el usuario es la siguiente:

package model

import javax.persistence.*

@Entity
@Table(name = 'MY_TABLE')
@IdClass(MyIdClass.class)
class MyClass implements Serializable{

    @Id
    @Column(name = "MY_COLUMN_1")
    Long column1

    @Id
    @Column(name = "MY_COLUMN_2")
    Long column2

    @Id
    @Column(name = "MY_COLUMN_3")
    String column3

    @Id
    @Column(name = "MY_COLUMN_4")
    Date date1

    @Column(name = "MY_COLUMN_5")
    Date date2

    @Column(name = "MY_COLUMN_6")
    BigDecimal column6
}

@Embeddable
class MyIdClass implements Serializable{
    Long column1
    Long column2
    String column3
    Date date1;
}

El repositorio correspondiente es:

package repository

import org.springframework.data.repository.CrudRepository

interface MyRepository extends CrudRepository<MyClass, Long>{
}

Mi servicio es:

package service

import model.MyClass
import repository.MyRepository
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service

@Service
class MyService {

    @Autowired
    MyRepository repository

    void save(MyClass myClass) {
        repository.save(myClass)
    }
}

Mi controlador monta un objeto MyClass con todo el conjunto de datos, incluida la clave compuesta. Cuando llama al método save del servicio, el objeto no se inserta en la base de datos. Vi los registros y verifiqué que hay un SELECT en MY_TABLE en lugar de INSERT. Traté de no informar la clave compuesta en el objeto y luego el método de guardado hizo un INSERT con error debido a valores nulos en la clave principal.

Realmente no entiendo por qué no se realiza la inserción cuando la clave compuesta tiene valores. ¿Cómo puedo resolverlo?

Ya probé con @Transactional en la clase de servicio y no funcionó. No hice ninguna configuración de Transacción en el proyecto ya que Spring Boot lo entrega por defecto.

Gracias.

0
Fabrizio 26 ago. 2017 a las 00:50

2 respuestas

La mejor respuesta

Tomo su ejemplo de código y lo probé en un proyecto Spring Boot de muestra, donde pude guardar en H2 DB (en memoria) con las anotaciones @Embeddable y @EmbeddedId. Si desea verificar, puede clonar el repositorio de GitHub y ejecutar BootJpaApplication.java como una aplicación Java. Después de la ejecución, acceda a la consola H2 con el enlace a continuación desde local donde se pueden verificar los detalles de la tabla.

http://localhost:8080/h2-console enter image description here https://github.com/sujittripathy/springboot-sample.git

Espero que el detalle ayude :)

1
Sujit 27 ago. 2017 a las 01:25

Parece que está utilizando MyIdClass como Id. De MyClass. Entonces, el repositorio debería ser:

interface MyRepository extends CrudRepository<MyClass, MyIdClass>{
}

Espero que esto ayude.

2
Kenny Tai Huynh 25 ago. 2017 a las 22:44