Eu estou usando hibernate-tipos-52 por Vlad Mihalcea juntamente com Primavera JPA para inserir um POJO como um valor JSON em meu banco de dados PostgreSQL.
Meu entidade é definido da seguinte forma:
@Entity
@Table(name = "hoshin_kanri")
@TypeDef(
name = "jsonb",
typeClass = JsonBinaryType.class
)
public class HKEntity {
@Id
@Column(name = "id_ai", columnDefinition = "bigint")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id_ai;
@Column(name = "id_hk", columnDefinition = "bigint")
private Integer id_hk;
@Type(type = "jsonb")
@Column(name = "hk_data", columnDefinition = "jsonb")
private HKData hk_data;
public HKEntity(Integer id_hk, HKData hk_data) {
this.id_hk = id_hk;
this.hk_data = hk_data;
}
E este é o POJO:
public class HKData {
private String name;
private Year targetYear;
private String description;
public HKData(String name, Year targetYear, String description) {
this.name = name;
this.targetYear = targetYear;
this.description = description;
}
Eu defini uma interface de repositório para consultar os objetos no banco de dados:
public interface HKRepository extends CrudRepository<HKEntity, Integer> {
@Query(value = "INSERT INTO 'hk_data' VALUES :Entity", nativeQuery = true)
void test_json(@Param("Entity") HKEntity e);
}
e um teste de serviço só para ver se ele está funcionando corretamente:
@Service
public class HKService {
@Autowired
HKRepository hk_repository;
public String json_test() {
HKData d = new HKData("Prova", Year.now(), "Descrizione");
HKEntity e = new HKEntity(1,d);
hk_repository.test_json(e);
return "Value created";
}
}
No entanto, eu continuo recebendo a seguinte exceção:
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.ehk.rest.entity.HKEntity
Eu tentei muitas correções sugeridas para este erro, mas eu não consigo entender a natureza do próprio erro. O que está errado com esta abordagem? Ao lado de uma ponta para a fixação isso, eu gostaria de entender por que esse erro é originado.
Os meios de erro que há uma instância da HKEntity
entidade que é referenciado a partir de algum lugar na sessão atual Hibernate, e você persistido nem explicitamente neste caso, nem instruído Hibernate para persistir lo cascadly. É difícil dizer o que exatamente está acontecendo, mas há alguns problemas com seu código que poderia ter confundido quer framework Spring dados JPA, ou o próprio Hibernate.
Em primeiro lugar, da Primavera CrudRepository
interface já tem um save()
método, para que você possa usá-lo em vez de seu test_json()
método.
Eu também não vejo nenhuma razão em inserir uma entidade Hibernate com uma consulta nativa, e eu nem sequer penso que esta é uma consulta válida. Seu test_json()
método tenta inserir nativamente uma HKEntity
entidade para a hk_data
mesa, mas a HKEntity
entidade deve ser guardado na hoshin_kanri
tabela, de acordo com o seu mapeamento.
Assim, gostaria de alterar o código de serviço da seguinte forma:
public String json_test() {
HKData d = new HKData("Prova", Year.now(), "Descrizione");
HKEntity e = new HKEntity(1,d);
hk_repository.save(e);
return "Value created";
}