【问题标题】:Spring boot Jpa Entity, map same referenced column as id and entitySpring boot Jpa Entity,映射相同的引用列作为id和实体
【发布时间】:2021-09-03 03:44:09
【问题描述】:

我有两个表 user 和 student。学生和用户是一对一的关系。 我在 StudentEntity 中使用 userId 和 UserEntity 映射同一列

@实体 @Table(name = "用户") 公共类用户{ @ID 私有 UUID id; @Column(名称 = "名称") 私有字符串名称; ... // 为简洁起见忽略 getter setter } @实体 @Table(name = "学生") 公共课学生{ @ID 私有 UUID id; @Column(name = "user_id") 私有 UUID 用户 ID; @OneToOne @JoinColumn(name = "user_id", referencedColumnName = "id", 可插入 = 假,可更新 = 假) 私人用户实体用户实体; ... // 为简洁起见忽略 getter setter }
@Repository
public interface StudentRepository extend PagingAndSortingRepository<StudentEntity, UUID> {

  Optional<StudentEntity> findByUserId(UUID userId);
}

现在当我调用以下任何方法时,UserEntity 未填充

StudentEntity student = studentRepository.findByUserId(userId).get() student.getUserId() --- 这是存在的 student.getUserEntity() -- NULL

不确定为什么在此调用中没有填充 UserEntity。

【问题讨论】:

  • 您的代码对我有用。你能展示整个方法吗?您是否在同一事务中保存和查找用户?
  • 移除这个字段 @Column(name = "user_id") private UUID userId;它应该可以工作
  • 通过在 JoinColumn 注释中指定 user_id 可以使一切正常工作。您的实体中的 userId 不需要单独的字段
  • 问题是我需要两者,以便在春季启动时我可以使用 findByUserId() 和 findByUserEntity()
  • @SimonMartinelli 我尝试了相同和不同的交易,但仍然为空

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


【解决方案1】:

您可以通过在关系的所有者中使用 mappedby 来尝试如下所示的反向映射映射 jpa hibernate @OneToOne @JoinColumn referencedColumnName ignored

【讨论】:

    【解决方案2】:

    问题很可能是您的持久性上下文仍然包含您之前保存的实体(没有用户集)。您首先必须清除持久性上下文并再次加载它才能看到非空用户。

    无论如何,就像 cmets 中建议的那样,我建议您只映射用户。您不需要 userId 字段。您现在映射它的方式,您应该可以使用以下内容:

    Optional<StudentEntity> findByUserEntityId(UUID userId);
    

    另请阅读官方文档以了解有关此事的更多信息:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-property-expressions

    【讨论】:

    • 是的,这会起作用,但是现在当我想保存一个新的学生实体时,我必须在 StudentEntity 对象中传递完整的 UserEntity。如果 userId 是此类的一部分,那么我将不需要它,只需传递 userId。我不必为了获得完整的 UserEntity 进行另一个 db 调用
    • 你不必,你可以使用EntityManager.getReference来避免数据库调用。我认为在春天,这是通过存储库中的getOne 方法浮出水面的
    • 所以 getOne 对我有用。谢谢,这就是我想要实现的目标
    猜你喜欢
    • 2019-12-29
    • 2020-10-26
    • 2021-10-16
    • 2019-05-08
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    相关资源
    最近更新 更多