首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JPA中的自引用字段映射

JPA中的自引用字段映射
EN

Stack Overflow用户
提问于 2011-12-20 03:28:20
回答 4查看 8.5K关注 0票数 6

假设我们有User实体类。用户可以成为其他用户的朋友。如何在不创建名为Connection的新实体或在数据库中创建多个条目的情况下映射此自引用集合字段?

代码语言:javascript
运行
复制
@Entity
public class User {
...
@ManyToMany
private Collection<User> friends;
...
}

USER_ID-FRIEND_ID
1 - 2
2 - 1 (duplicate... I don't need it)
EN

Stack Overflow用户

发布于 2017-07-14 22:08:40

嗯,事实上你可以。

您可以使用@PreUpdate、@PrePersists、@PostUpdate等注释手动转换集合的元素。这样,你的实体就可以按照你想要的方式呈现它们,而在数据库中,你只需要存储一个原始文本。

一种更合理的选择是使用@Convert注释,从JPA2.1开始就可以使用(hibernate中的@UserType)。它告诉jpa在每次读取/保存到数据库时将字段转换为另一种类型。对于它,你应该使用@Convert替代,指定和AttributeConverter对象。

例如

代码语言:javascript
运行
复制
    public class Parent {
      @Id
      private Integer id;

      @Convert(converter = FriendConverter.class)
      private Set<Parent>friends;
    }

和如下所示的转换器类:

代码语言:javascript
运行
复制
    @Component
    public class FriendConverter implements AttributeConverter<List, String>{
      @Autowired
      private SomeRepository someRepository;

      @Override
      public String convertToDatabaseColumn(List attribute) {
        StringBuilder sb = new StringBuilder();
        for (Object object : attribute) {
          Parent parent = (parent) object;
          sb.append(parent.getId()).append(".");
        }
        return sb.toString();
      }

      @Override
      public List convertToEntityAttribute(String dbData) {
        String[] split = dbData.split(".");
        List<Parent>friends = new ArrayList<>();
        for (String string : split) {
          Parent parent = someRepository.findById(Integer.valueOf(string));
          friends.add(accion);
        }
        return friends;
      }
    }

它是一个虚拟的实现,但它给了你一个想法。

作为个人评论,我确实建议按照应该的方式映射关系。在未来,它将避免您的问题。AttributeConverter在处理枚举时派上了用场

票数 0
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8566400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档