假设我们有User实体类。用户可以成为其他用户的朋友。如何在不创建名为Connection的新实体或在数据库中创建多个条目的情况下映射此自引用集合字段?
@Entity
public class User {
...
@ManyToMany
private Collection<User> friends;
...
}
USER_ID-FRIEND_ID
1 - 2
2 - 1 (duplicate... I don't need it)发布于 2017-07-14 22:08:40
嗯,事实上你可以。
您可以使用@PreUpdate、@PrePersists、@PostUpdate等注释手动转换集合的元素。这样,你的实体就可以按照你想要的方式呈现它们,而在数据库中,你只需要存储一个原始文本。
一种更合理的选择是使用@Convert注释,从JPA2.1开始就可以使用(hibernate中的@UserType)。它告诉jpa在每次读取/保存到数据库时将字段转换为另一种类型。对于它,你应该使用@Convert替代,指定和AttributeConverter对象。
例如
public class Parent {
@Id
private Integer id;
@Convert(converter = FriendConverter.class)
private Set<Parent>friends;
}和如下所示的转换器类:
@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在处理枚举时派上了用场
https://stackoverflow.com/questions/8566400
复制相似问题