我正在构建一个库,它通过REST接口直接公开持久性单元中的实体,并包含在JAX-RS或标准Web应用程序中。
为了促进该库的可用性,我希望库本身在必要时管理双向关联的设置/取消设置,以便使用简单的状态表示来实现复杂实体关系的持久性和修改。
例如,考虑典型的“项目和员工”模型,并假设从项目到员工之间存在一对多的关系 - 一个< em> Project 可以包含多个 Employee 实体, Employee 一次只能“属于”一个 Project 。 / p>
此外,假设此关系是双向的 - 员工具有项目属性,项目具有员工 property,返回当前“属于” Project 的 Employee 实体的集合。属性 Employee.project 和 Project.employees 映射双向关联的两面。
请考虑以下网址:
PUT /Project/1/employees
附带的(JSON)状态表示
//Employee representation
{
firstName: "some",
lastName: "guy",
salary: 1000000.01,
...
...
}
此URL /状态表示组合指示我的库构建 Employee 实体并将其添加到 Project 的 Project.employees 集合中,识别属性产生值'1'。
我需要做的是,在标准 Metamodel API的情况下,确定 Employee 是否具有满足此关联的双向方面的某些属性,如果存在,那么我可以将该属性设置为相关的 Project 实体。
换句话说,我需要能够确定 Employee 具有 Employee.project 属性,该属性满足 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 );
我当前的实现依赖于模仿JPA 2.0映射中的“mapped-by”属性的自定义注释,并且我计划在JPA 2.0注释中实现对“mapped-by”属性值的检查。这工作但是,它需要专有配置(我试图摆脱),或JPA 2.0注释(如果有人专门使用映射文件会怎么样?)。
如果在给定Entity java类型和Metamodel API时,任何人都可以指出我正确的方向来确定双向关联双方所涉及的属性,那么将非常感激。
答案 0 :(得分:2)
我得出结论,无法从标准Persistence Metamodel获得这样的双向数据。我已经通过使用现有的JPA 2.0注释解决了我的问题,如果正在使用XML映射,则回退到自定义的@Bidirectional注释。