Vâng, trên thực tế bạn có thể.
Bạn có thể sử dụng chú thích như @PreUpdate, @PrePersists, @PostUpdate và như vậy để chuyển đổi thủ công các phần tử của bộ sưu tập. Bằng cách này, thực thể của bạn có thể hiển thị theo cách họ muốn trong khi trong cơ sở dữ liệu, bạn chỉ lưu trữ văn bản thô.
Một giải pháp thay thế tạm thời hơn sẽ là sử dụng chú thích @Convert, có sẵn từ jpa 2.1 (@UserType trong chế độ ngủ đông). Nó báo cho jpa chuyển đổi trường thành một kiểu khác mỗi khi nó đọc/lưu trong cơ sở dữ liệu. Đối với nó, bạn nên sử dụng @Convert anotation, chỉ định và đối tượng AttributeConverter.
Ví dụ
public class Parent {
@Id
private Integer id;
@Convert(converter = FriendConverter.class)
private Set<Parent>friends;
}
Và lớp chuyển đổi như sau:
@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;
}
}
Đó là một thực hiện giả nhưng nó mang lại cho bạn những ý tưởng.
Là nhận xét cá nhân, tôi khuyên bạn nên lập bản đồ mối quan hệ theo ý muốn. Trong tương lai nó sẽ giúp bạn tránh được vấn đề. AttributeConverter có ích khi làm việc với enums
Một mối quan hệ nhiều-tham chiếu tự tham chiếu là hợp lệ và có thể được ánh xạ bằng cách sử dụng chú thích JPA. Giống như tất cả các mối quan hệ nhiều-nhiều, bạn phải xác định một bảng cầu để lưu trữ cả hai mặt của mối quan hệ. Thực thể sẽ xác định một trường cho phía sở hữu và một trường khác cho phía ánh xạ của mối quan hệ. – scottb