我想根据order
值将book
表加入到不同的商品表(food
或item_type
)中。如果item_type
为0,则item_id
应来自book
表。如果item_type
为1,则item_id
应来自food
表。
以下是示例表。我希望他们可以帮助你理解我的问题。
create table order{
id int(11) unsigned NOT NULL AUTO_INCREMENT,
item_type int,
item_id int
}
create table book{
id int(11) unsigned NOT NULL AUTO_INCREMENT,
desc varchar(100)
}
create table food{
id int(11) unsigned NOT NULL AUTO_INCREMENT,
field1 varchar(100)
}
我尝试过使用@wherejointable
注释。
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "item_id",insert="false" update="false")
@WhereJoinTable(clause = "item_type=0")
public Book getBook() {
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "item_id",insert="false" update="false")
@WhereJoinTable(clause = "item_type=1")
public Food getFood() {
}
但是,我收到以下错误:
Repeated column in mapping for entity: column: item_id (should be mapped with insert="false" update="false")
这可以在休眠中实现吗?
答案 0 :(得分:1)
您需要将@Any注释用于非可继承的连接:
@Any(metaColumn = @Column(name = "ITEM_TYPE"))
@AnyMetaDef(idType = "int", metaType = "int",
metaValues = {
@MetaValue(targetEntity = Book.class, value = "0"),
@MetaValue(targetEntity = Food.class, value = "1")
})
@JoinColumn(name="ITEM_ID")
private Object item;
因此item
可以Book
或Food
加载。
答案 1 :(得分:0)
我有另一个解决方案来解决这个问题,即对Order表使用继承。在您的问题中,您必须放置两种类型的订单和面向对象的方法,这些类型是BookOrder和FoodOrder,它们使用单表继承策略共享同一个表。
预订课程。
@Entity
public class Book {
@Id
@GeneratedValue
private int id;
private String description;
}
食品类
@Entity
public class Food {
@Id
@GeneratedValue
private int id;
private String field1;
}
让我们创建一个抽象的订单类
@MappedSuperclass
public abstract class Order {
@Id
@GeneratedValue
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
现在我们为这个Order表创建了两个子类,我们使用单表继承,因此我们需要提供辨别列(这是hibernate映射到对象的列),我们将其定义为" ITEM_TYPE"列。
BookOrder
@Entity
@Table(name = "orders")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "item_type", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue(value = "0")
public class BookOrder extends Order {
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "item_id")
private Book book;
}
现在我们有了FoodOrder表,它再次扩展了Order表
@Entity
@Table(name = "orders")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "item_type", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("1")
@Data
public class FoodOrder extends Order {
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "item_id")
private Food food;
}
上面的映射创建了你想要的表格。