スプリングJPA例外(休止-タイプ-52を使用して)JSON値を挿入しながら

Nastrius:

私が使用している休止状態-種類-52を一緒ヴラッド・ミホールセアで春JPA自分のPostgreSQLデータベースへのJSON値としてPOJOを挿入します。

私のエンティティは、このように定義されています。

@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;
    }

私は、データベースにオブジェクトを照会するためのリポジトリのインターフェースを定義しました:

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

私は、このエラーのために提案され、多くの修正を試みたが、私は、エラー自体の性質を理解することはできません。このアプローチで間違っては何ですか?この固定用の先端の横に、私はこのエラーが発信された理由を理解したいと思います。

セルゲイPetunin:

そこのインスタンスだとエラー手段HKEntity、現在のHibernateセッション中にどこかから参照されたエンティティ、あなたはどちらも明示的にこのインスタンスを持続し、またcascadlyそれを永続化するためにHibernateを指示しました。それは正確には何が起こっているかを言うのは難しいですが、春データJPAフレームワーク、または休止状態自体のいずれかを混同している場合がありますあなたのコードを持ついくつかの問題があります。

まず、春の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";
    }

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=372840&siteId=1