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

标签 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 字段(通过将 emp_name_id 列与 Name_Details.id 列连接起来找到)。 那么,在 JPA 中是否有可能在我的 Employee 类中声明一个名为 String employeeName 的 transient 变量,并让 JPA 根据上述关系检索该变量? 这是我所拥有的一个简化示例,其中有几个带有名称/值对的表,并且主表具有值。我需要这个来阅读而不是更新/删除等。 我没有在 WPS 6.1 上将 JPA v1.x 与 EJB3(而不是 hibernate )一起使用

谢谢G

最佳答案

有几个选项。

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

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

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

关于java - JPA 从子表中检索名称值而不使用子模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3626282/

相关文章:

php - Doctrine ORM : Create Table Like Another

python - 可以在 SQLAlchemy 中设置类似 rails 的关联吗?

java - 如何在 android studio 中调用已编译的 jar 文件的 java 类?

java - 如何在 Java 和 JavaScript 之间传递字节数组

node.js - 关于 loopback.js 与 express js 的建议

java - 没有名为 MyBuzzPersistence 的 EntityManager 持久性提供程序

java - eclipse默认的jpa实现库哪里下载?

Java Spring Boot - JPA : StackOverflowError with a @ManyToMany relation

java - 在 Google App Engine 上运行数据存储区查询

java - Spring Boot 异常堆栈跟踪日志记录