【问题标题】:How to create a non-persistent Field in an JPA Entity?如何在 JPA 实体中创建非持久字段?
【发布时间】:2018-04-26 05:02:17
【问题描述】:

我有一个名为 Users 的实体,它具有 登录名、姓名和部门 作为存储在 Users 表中的字段。

我的Spring-Boot 配置定义了为该应用程序中的用户提供系统管理员角色的部门。

关键问题是我希望登录 end-point 返回用户数据以及他/她是或不是系统管理员的附加信息。

我认为这些信息应该在 User 类中,但我不希望这些信息与其他字段一起存储在数据库中,因为管理部门可能会更改,或者用户从一个部门更改为另一个部门不管理系统。

(Edit) 当用户请求 login() 时,我将定义这个 IsManager 字段:我将获取用户的 department 字段并检查 managerDepartment 的列表将其设置为 true 或 false。

所以问题是将这些信息放在实体类的非持久字段中是否正确(以及如何做到这一点),或者我是否可以更改 rest 方法中的 ResponseEntity 以添加附加信息(以及怎么样)?

【问题讨论】:

  • 如果信息一开始没有持久化到数据库中,你期望如何检索信息?
  • @AyoK 我将编辑问题以澄清这一点。

标签: java jpa spring-boot spring-data-jpa


【解决方案1】:

简短的回答是使用 @Transient 注释。 正确的答案是将 UserEntity 和 UserDto 分成两个不同的类,并使用 MapStruct 进行转换。

【讨论】:

  • 如何加入ORA错误和Transient注解?! “表必须为空”表示它所说的或新添加的列应具有默认值。
  • @PSyLoCKe 谢谢你,但是,我仍然建议你按照我回答的第二句话。
  • in this answer 所述,如果您想要快速而肮脏的@Transient 解决方案,可能需要额外的注释。
【解决方案2】:

嗯,这似乎是一个偏好/意见问题,希望仍未因此而结束。

添加@Transient 字段并没有什么害处,但我仍然倾向于避免像这样更改@Entities

因此,在一个非常相似的情况下,我决定创建一个包装器 Response 类,该类包含 User 和诸如系统管理员角色之类的“间接角色”。

这主要是因为我将所有实体类放在一个单独的项目/jar 中,然后用于各种客户端和服务。然后在@Entity 中添加任何内容之前,我会分析是否有任何其他依赖代码需要这些东西,或者它是否仅与此服务相关。

如果添加仅与此特定服务/客户端相关,我不想将其添加到 @Entity 并使其“更复杂”,因为仅此服务需要。

所以我认为我的答案包含在前一段中。

【讨论】:

  • 这个问题是针对改变Entity或者ResponseEntity的,所以我认为你的回答是有效的。唯一的问题是你没有回答如何去做。所以它可能只被认为是答案的一半。
  • @PSyLoCKe 是的,我似乎很高兴地省略了 (and how) 部分。但我现在不确定你的问题出在哪里,创建包装类,返回诸如 ResponseEntity 之类的?
  • 我没有理解“包装响应”部分。
  • @PSyLoCKe 它只是一个包装类,比如 UserInfo ,它同时包含 user 和布尔值 isManager ,然后返回而不是普通的 User 。但是因为我对 Spring 不够熟悉,而且您没有提供任何实际代码,现在如何详细构建响应,所以我无能为力。如果我猜测它是这样的ResponseEntity<User> => ResponseEntity<UserInfo>
猜你喜欢
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 2011-08-04
  • 2015-01-15
  • 1970-01-01
相关资源
最近更新 更多