2

JAX-RSまたは標準のWebアプリケーションに含めるために、RESTインターフェースを介して永続性ユニット内のエンティティーを直接公開するライブラリーを構築しています。

このライブラリの使いやすさを促進するために、単純な状態表現を使用して複雑なエンティティ関係の永続化と変更を可能にするために、必要に応じてライブラリ自体が双方向の関連付けの設定/設定解除を管理するようにします。

例として、典型的な「プロジェクトと従業員」モデルを考え、プロジェクトから従業員への1対多の関係があると仮定します。プロジェクトには複数の従業員エンティティを含めることができ、従業員は1つのプロジェクトにのみ「属する」ことができます。一度に。

また、この関係が双方向であると仮定します。従業員にはプロジェクトプロパティがあり、プロジェクトには、現在プロジェクトに「属している」従業員エンティティのコレクションを返す従業員プロパティがあります。プロパティ Employee.projectおよびProject.employeesは、双方向の関連付けの2つの側面をマップします。

次のURLを検討してください。

PUT /Project/1/employees

そして、付随する(JSON)状態表現

//Employee representation
{
   firstName: "some", 
   lastName:  "guy",
   salary: 1000000.01,
   ...
   ...
}

このURL/状態表現の組み合わせは、私のライブラリにEmployeeエンティティを作成してプロジェクトのProject.employees コレクションに追加するように指示します。このコレクションの識別プロパティは値「1」を生成します。

私ができる必要があるのは、標準のMetamodel APIを前提として、 Employeeにこの関連付けの双方向の側面を満たすプロパティがあるかどうかを判断し、そのプロパティを問題のプロジェクトエンティティに設定できるようにすることです。 。

つまり、 EmployeeがProject.employeesアソシエーションの双方向コンポーネントを満たすEmployee.projectプロパティを持っている ことを確認できる必要があります。

したがって、状態とURLの組み合わせは、基本的に次のタスクを実行します。

EntityManager em = ....;

//this is the Employee represented by the state representation    
Employee employee = ..... ;

Object id = 1;
Project project = em.find( Project.class, id );
project.getPersons().add( employee );

次のことをいつ行うべきかを知る必要があります

employee.setProject( project );

私の現在の実装は、JPA2.0マッピングの「mapped-by」属性を模倣するカスタムアノテーションに依存しており、JPA2.0アノテーションの「mapped-by」属性値のチェックを実装することを計画しています。これは機能しますが、独自の構成(私が取り除こうとしている)またはJPA 2.0アノテーション(誰かがマッピングファイルを排他的に使用している場合はどうなりますか?)が必要です。

EntityjavaタイプとMetamodelAPIが与えられたときに、双方向の関連付けの両側に関係するプロパティを決定するために誰かが私を正しい方向に向けることができれば、それは最もありがたいことです。

4

1 に答える 1

2

標準の Persistence Metamodel からそのような双方向データを取得する方法はないという結論に達しました。XML マッピングが使用されている場合は、カスタム @Bidirectional アノテーションにフォールバックして、既存の JPA 2.0 アノテーションを使用することで問題を解決しました。

于 2012-07-18T13:32:52.053 に答える