Spring Boot JPA 关联关系动态类型的解决方案

例如我有一个对象叫多媒体,里面的对象有书,电影,音乐等,但又不想设置3个关联关系,就可以把图书,电影,音乐抽象出一个media的interface,然后其他对象直接关联media这个interface就可以了

@MappedSuperclass
@Getter
@Setter
public class BaseModel {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
}
interface Media {
}
class Book extends BaseModel implements Media {
}
class Movie extends BaseModel implements Media {
}
class Music extends BaseModel implements Media {
}
class MediaItem extends BaseModel {
    @JsonIgnore
    @Any(
            metaDef = "PropertyMetaDef",
            metaColumn = @Column(name = "target_type")
    )
    @JoinColumn(name = "target_id", columnDefinition = "bigint")
    @AnyMetaDef(name = "PropertyMetaDef", metaType = "string", idType = "long",
            metaValues = {
                    @MetaValue(value = "Book", targetEntity = Book.class),
                    @MetaValue(value = "Music", targetEntity = Music.class),
                    @MetaValue(value = "Movie", targetEntity = Movie.class)
            }
    )
    @QueryType(PropertyType.NONE)
    private Media target;

    @Column(name = "target_type", insertable = false, updatable = false)
    private String targetType;

}

这样子的话就可以直接把Media设到MediaItemtarget就可以了

Book book = new Book();
bookRepository.save(book);
MediaItem item = new MediaItem();
item.setTarget(book);
mediaItemRepository.save(item);

参考