JPA从子表中检索名称值而不使用子模型

时间:2010-09-02 10:38:43

标签: java orm jpa

这是我真正希望能够做到的事情 - 根据id值解析名称而不取出整个子模型。

这是我所拥有的一个示例,一个表说Employee和一个Name_Details表 员工可能看起来像这样

Create Table Employee {
  emp_idinteger not null generated by default as identity; -- generated pk
  Department varchar(44);
  emp_name_id  Integer;  -- fk to Name_Details table
  ...other details such as hire_date etc..
}

现在emp_id是name_details表的外键,可能如下所示: -

Create Table Name_Details {
  id Integer;
  Name varchar(32);
  Address Varchar(127);
  Postcode Varchar(10);
  --other details..
}

我的问题是我想用Java类建模第一个表Employee,但是我不想在Employee类和Name_Details表之间建立一对一的关系来获取整个Name_details表(因为它非常大)我从第二个类中得到的唯一信息就是Name字段(通过使用Name_Details.id列连接emp_name_id列找到)。 那么在JPA中是否可以在我的Employee类中声明类似于一个名为String employeeName的瞬态变量,并根据上述relationShip将其检索到JPA? 这是一个简单的例子,我有几个表有名称 - 值对,主表有值。我需要这个来阅读而不是更新/删除等。 我没有在WPS 6.1上使用JPA v1.x和EJB3(而不是hibernate)

Thx G

1 个答案:

答案 0 :(得分:1)

有几个选择。

第一种是创建一个映射到Name_Details的Name类,但只映射name和id字段。然后,员工将拥有OneToOne to Name,并且只会读取该名称。

第二个选项是将Name_Details定义为Employee中的@SecondaryTable,并仅映射其中的名称。 JPA规范限制辅助表连接必须共享相同的ID,但根据您使用的JPA提供程序,可能使用1-1外键(EclipseLink支持此操作)。您还可以定义连接并映射到视图的视图。

第三种解决方案是仍然映射所有Name_Details字段,但将它们定义为LAZY。如果您的JPA提供程序支持LAZY基础(或获取组),那么除非被访问,否则不会获取这些内容。