我使用Vlad的hibernate-types-52和Spring 将POJO作为Json值插入到我的Postgresql数据库中。
我的实体是这样定义的:
@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;
}这就是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;
}我定义了一个Repository接口来将对象查询到数据库中:
public interface HKRepository extends CrudRepository<HKEntity, Integer> {
@Query(value = "INSERT INTO 'hk_data' VALUES :Entity", nativeQuery = true)
void test_json(@Param("Entity") HKEntity e);
}还有一个测试服务,看看它是否正常工作:
@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";
}
}但是,我仍然得到以下例外情况:
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.ehk.rest.entity.HKEntity我尝试过许多针对此错误的修复,但我无法理解错误本身的本质。这种方法有什么问题?除了修复此错误的提示之外,我还想了解为什么会产生此错误。
发布于 2020-03-28 10:58:11
这个错误意味着有一个HKEntity实体的实例,它是从当前Hibernate会话的某个地方引用的,您既没有显式地持久化这个实例,也没有指示Hibernate级联地保存它。很难说到底是怎么回事,但是代码中有些问题可能混淆了Spring框架或Hibernate本身。
首先,Spring的CrudRepository接口已经有了一个save()方法,所以您可以使用它而不是test_json()方法。
我也没有理由插入带有本机查询的Hibernate实体,而且我甚至不认为这是一个有效的查询。test_json()方法本机尝试将HKEntity实体插入到hk_data表中,但是根据映射,HKEntity实体应该保存到hoshin_kanri表中。
因此,我将按以下方式更改您的服务代码:
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";
}https://stackoverflow.com/questions/60900128
复制相似问题