Web アプリケーション (Spring を使用) に RESTful サポートを追加しているので、次のような CRUD 操作を実行できます: 参加者に関する情報を読む (JSONSerialize):
$ curl -i -H "Accept: application/json" http://localhost:8080/dancingwithstars/participant/1
{
"birthDate": "2013-01-23",
"code": "JS0001",
"firstName": "Julia",
"mainFunction": {
"code": "AA"
"name": "Principal Dancer"
},
"gender": "F",
"height": 160.00,
"id": 1,
"lastName": "Smith",
"version": 1,
"weight": 55.00
}
または、新しい参加者を作成します (JSONDeserialize)
$ curl -i -X POST -H "Content-Type: application/json" -H "Accept: application/json" -d '{"birthDate":"2013-01-15","code":"AT0001","firstName":"Angela","mainFunction":{"code": "AB", "name":"Choreografer"},"gender":"F","height":189.00,"lastName":"Wright","version":0,"weight":76.00}' http://localhost:8080/dancingwithstars/participants
しかし問題は、参加者を作成するために mainFunction オブジェクトのすべてのフィールドを知る必要はありません。唯一のコードを知る必要があるだけです。シリアライゼーションには、次を使用できます。
return new JSONSerializer().include("mainFunction.code").exclude("mainFunction.*").exclude("*.class").transform(new DateTransformer("yyyy-MM-dd"), Date.class).prettyPrint(true).serialize(this);
そして、次のjsonを取得します。
{
"birthDate": "2013-01-23",
"code": "JS0001",
"firstName": "Julia",
"mainFunction": {
"code": "AA"
},
"gender": "F",
"height": 160.00,
"id": 1,
"lastName": "Smith",
"version": 1,
"weight": 55.00
}
デシリアライズについてはわかりません。要件はかなり一般的であるように思われるので、フォーラムで質問したいと思いました。何か案は?
要約すると、子オブジェクトへの参照 (多対 1) を持つ親オブジェクトがあります。親に子供のすべての情報を提供すれば、すべてうまくいきます。しかし、ちょっと待ってください。子供の ID があれば、親を安全に保つのに十分なはずです。子の ID だけで親を保存しようとすると、次の例外が発生します。
org.hibernate.TransientPropertyValueException: オブジェクトが保存されていない一時インスタンスを参照しています - フラッシュする前に一時インスタンスを保存します
何かご意見は?
アグスティン
2013 年 1 月 27 日更新: この問題は Hibernate に起因するようです。製品とカテゴリがあるとします。この関係は、製品がカテゴリへの参照を持っていることです (多対 1 の関係)。以前にデータベースに保存されたカテゴリを指定します。商品を作成することはできず、商品を作成するためにカテゴリの ID を指定するだけです。Hibernate は製品を作成するためにバージョンを確認しませんが、バージョンも必要になります。下記参照:
/*
* Create one category before the product
*/
Category cat1 = new Category();
cat1.setCode("KIT");
cat1.setName("Kitchen products");
session.save(cat1);
session.flush();
session.clear();
Category cat1db = (Category) session.get(Category.class, cat1.getCode());
logger.info(cat1.toString());
assertNotNull(cat1db.getVersion());
/*
* Create the product and assign it a category
*/
Product p1 = new Product();
p1.setName("Kettle");
p1.setPrice(4D);
Category c1 = new Category();
c1.setCode("KIT");
//c1.setVersion(new Integer(666));
p1.setCategory(c1);
session.save(p1);
session.flush();
session.clear();
Product p1db = (Product) session.get(Product.class, p1.getId());
logger.info(p1.toString());
assertNotNull(p1db.getId());
それは失敗します。ただし、カテゴリのバージョンのコメントを外すと、製品が作成されます。また、Hibernate はデータベースに対して追加のクエリを実行し、そのカテゴリを要求します。
ここで 2 つの質問:
- 最後にそれが見えないのに、Hibernate がフィールド バージョンを必要とするのはなぜですか?
- Hibernate がカテゴリを要求する追加のクエリを実行するのはなぜですか?
あなたの考え?