例如我有一个对象叫多媒体,里面的对象有书,电影,音乐等,但又不想设置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
设到MediaItem
的target
就可以了
Book book = new Book();
bookRepository.save(book);
MediaItem item = new MediaItem();
item.setTarget(book);
mediaItemRepository.save(item);