Chú thích @Any định nghĩa sự liên kết đa hình với các lớp từ nhiều bảng. Kiểu ánh xạ này luôn yêu cầu nhiều hơn một cột. Cột đầu tiên giữ kiểu của thực thể liên kết. Các cột còn lại giữ số nhận dạng. Không thể chỉ định ràng buộc khoá ngoại cho loại liên kết này, do đó, điều này chắc chắn không có nghĩa là cách thông thường của các liên kết ánh xạ (đa hình). Bạn chỉ nên sử dụng này trong các trường hợp rất đặc biệt (ví dụ: nhật ký kiểm tra, dữ liệu phiên của người dùng, v.v.). Chú thích @Any mô tả cột chứa thông tin siêu dữ liệu. Để liên kết giá trị của thông tin siêu dữ liệu và loại thực thể thực, chú thích @AnyDef và @AnyDefs được sử dụng.
@Any(metaColumn = @Column(name = "property_type"), fetch=FetchType.EAGER)
@AnyMetaDef(
idType = "integer",
metaType = "string",
metaValues = {
@MetaValue(value = "S", targetEntity = StringProperty.class),
@MetaValue(value = "I", targetEntity = IntegerProperty.class)
})
@JoinColumn(name = "property_id")
public Property getMainProperty() {
return mainProperty;
}
idType đại diện cho loại thuộc tính định danh đối tượng mục tiêu và loại meta loại siêu dữ liệu (thường là Chuỗi). Lưu ý rằng @AnyDef có thể được tương tác và sử dụng lại. Bạn nên đặt nó làm siêu dữ liệu gói trong trường hợp này.
//on a package
@AnyMetaDef(name="property"
idType = "integer",
metaType = "string",
metaValues = {
@MetaValue(value = "S", targetEntity = StringProperty.class),
@MetaValue(value = "I", targetEntity = IntegerProperty.class)
})
package org.hibernate.test.annotations.any;
//in a class
@Any(metaDef="property", metaColumn = @Column(name = "property_type"), fetch=FetchType.EAGER)
@JoinColumn(name = "property_id")
public Property getMainProperty() {
return mainProperty;
}
@ManyToAny cho phép liên kết đa hình với các lớp từ nhiều bảng. Loại ánh xạ này luôn yêu cầu nhiều hơn một cột. Cột đầu tiên giữ kiểu của thực thể liên kết. Các cột còn lại giữ số nhận dạng. Không thể chỉ định ràng buộc khoá ngoại cho loại liên kết này, vì vậy đây là hầu hết các chắc chắn không có nghĩa là cách thức thông thường của các liên kết ánh xạ (đa hình). Bạn chỉ nên sử dụng trường hợp này trong các trường hợp đặc biệt rất (ví dụ: nhật ký kiểm tra, dữ liệu phiên của người dùng, v.v.).
@ManyToAny(
metaColumn = @Column(name = "property_type"))
@AnyMetaDef(
idType = "integer",
metaType = "string",
metaValues = {
@MetaValue(value = "S", targetEntity = StringProperty.class),
@MetaValue(value = "I", targetEntity = IntegerProperty.class) })
@Cascade({ org.hibernate.annotations.CascadeType.ALL })
@JoinTable(name = "obj_properties", joinColumns = @JoinColumn(name = "obj_id"),
inverseJoinColumns = @JoinColumn(name = "property_id"))
public List<Property> getGeneralProperties() {
Src: Hibernate Annotations Reference Guide 3.4.0GA
Hy vọng nó sẽ giúp!
Tôi muốn chỉ ra rằng thực tiễn này được coi là một mẫu chống SQL, theo sách Bill Karwin. – atorres