hibernate select操作でフィールドが切断されたエラーが発生しました
hibernateはオブジェクト向けの思想を使用して、データテーブルを抽象的にクラスにして、データ記録を抽象的にオブジェクトにして、比較的に完璧にsqlの明示的な使用を減らして、使うのも比較的に便利で、オブジェクトを操作することによってデータベースの記録を削除して変更することができます.利点:単一テーブルクエリーは簡単です. crud完全移植メソッドの呼び出し、 開発者sqlに対する要求の比較的低い欠点: マルチテーブルクエリーが面倒、 マッピングは比較的煩雑である フィールドは完全に検出され、性能が消費されるというメリットとデメリットは個人的な理解にすぎない. 次に、本稿のポイントを示します.
主役登場–遭遇した問題
最初はhibernateを勉強してもhibernateオブジェクトの状態の問題を考慮しなかった:最近のプロジェクトはhibernateの開発に用いられ、奇妙なエラーが発生した:ブロガーはコードの中でクエリーを実行し、データベースの記録をクエリーし、データテーブルとマッピング関係のあるPojoクラスを使用した.
JAva擬似コードは以下の通りです.
バグ登場
実際にインタフェースをテストしてこの方法を呼び出して、500エラーであることを発見して、しかもエラーを報告するのはフィールドが遮断されたエラーで、明らかに使用するselectだと思って、insertあるいはupdateがまだ言える過去ならば、selectだけで、このエラーを爆発させて、本当に理解しにくいです.
次にブレークポイントは、return objectまで実行され、例外は除外されません.returnの後は@Transactionalの地盤です.トランザクションをコミットし、例外を投げ出します.コンソールからsqlが出力されます.
update Pojo set = … where id=**
updateのsqlが出てきて、次はフィールドが切断されたエラーを考えて、そのsetRemarkメソッドの呼び出しによる問題であるべきで、ずっと前にhibertnateの三態を見たことがあるが、問題に遭遇していないので、知っているか分からないかのように一掃しただけで、これで問題に遭遇して、この方向に考えた.
快刀登場
setReark()の行のコードを注釈し、テストを開始し、インタフェース200は問題なく、推測をさらに確認した.トランザクションをコミットすると、オブジェクトがデータベースに同期する.具体的にはhiberbateの3つの状態を理解しましょう.
理論的サポート
三状態=一時+持続+遊離1
一時(Transient):new操作が作成され、セッションに関連付けられていません.セッションを使用して必要なsqlを実行すると、永続状態永続状態(Peristent)に変換できます.オブジェクトとデータベースのレコードにマッピングがあります.オブジェクトには永続化ID.hibernateがあり、永続化オブジェクトのすべての変更が検出され、現在の操作ユニットで実行され、現在の新しい状態が自動的に検出されます.(オブジェクト属性値を含む)データベースに同期する.フリーステート(Detached:永続オブジェクトに関連付けられたセッションが閉じると,オブジェクトはフリーステートになる.フリーステートへの参照は依然として有効であり,フリーオブジェクトが新しいセッションに関連付けられていると,再び永続状態に遷移し,フリーステートの間にそのオブジェクトが変化し,データベースに同期することもできる.
三状態の理解このブログからこの問題に戻ります.pojoオブジェクトはまだ持続的な状態にあるべきで、人為的に修正し、自動的にトランザクションを提出し、修正をデータベースに同期させ、このエラーが発生します.三状態の問題は注意深く研究する必要があります.↩︎
主役登場–遭遇した問題
最初はhibernateを勉強してもhibernateオブジェクトの状態の問題を考慮しなかった:最近のプロジェクトはhibernateの開発に用いられ、奇妙なエラーが発生した:ブロガーはコードの中でクエリーを実行し、データベースの記録をクエリーし、データテーブルとマッピング関係のあるPojoクラスを使用した.
JAva擬似コードは以下の通りです.
@Service
class myService{
@Transactional
Map<String,Object> getById(Integer pojoId){
Pojo object=PojoDao.get(pojoId);
if(object!=null){
object.setRemark("object from database");
}
Map<String,Object> result=new HashMap<>();
result.put("data",object);
return object;
}
}
バグ登場
実際にインタフェースをテストしてこの方法を呼び出して、500エラーであることを発見して、しかもエラーを報告するのはフィールドが遮断されたエラーで、明らかに使用するselectだと思って、insertあるいはupdateがまだ言える過去ならば、selectだけで、このエラーを爆発させて、本当に理解しにくいです.
次にブレークポイントは、return objectまで実行され、例外は除外されません.returnの後は@Transactionalの地盤です.トランザクションをコミットし、例外を投げ出します.コンソールからsqlが出力されます.
update Pojo set = … where id=**
updateのsqlが出てきて、次はフィールドが切断されたエラーを考えて、そのsetRemarkメソッドの呼び出しによる問題であるべきで、ずっと前にhibertnateの三態を見たことがあるが、問題に遭遇していないので、知っているか分からないかのように一掃しただけで、これで問題に遭遇して、この方向に考えた.
快刀登場
setReark()の行のコードを注釈し、テストを開始し、インタフェース200は問題なく、推測をさらに確認した.トランザクションをコミットすると、オブジェクトがデータベースに同期する.具体的にはhiberbateの3つの状態を理解しましょう.
理論的サポート
三状態=一時+持続+遊離1
一時(Transient):new操作が作成され、セッションに関連付けられていません.セッションを使用して必要なsqlを実行すると、永続状態永続状態(Peristent)に変換できます.オブジェクトとデータベースのレコードにマッピングがあります.オブジェクトには永続化ID.hibernateがあり、永続化オブジェクトのすべての変更が検出され、現在の操作ユニットで実行され、現在の新しい状態が自動的に検出されます.(オブジェクト属性値を含む)データベースに同期する.フリーステート(Detached:永続オブジェクトに関連付けられたセッションが閉じると,オブジェクトはフリーステートになる.フリーステートへの参照は依然として有効であり,フリーオブジェクトが新しいセッションに関連付けられていると,再び永続状態に遷移し,フリーステートの間にそのオブジェクトが変化し,データベースに同期することもできる.
三状態の理解このブログからこの問題に戻ります.pojoオブジェクトはまだ持続的な状態にあるべきで、人為的に修正し、自動的にトランザクションを提出し、修正をデータベースに同期させ、このエラーが発生します.三状態の問題は注意深く研究する必要があります.↩︎