如何将父项 table 与两个不相关的子项 table 相关联
How to associate a parent table with two unrelated Child tables
我想加入一个 order
table 到一个基于 item_type
价值。如果item_type
是0,item_id
应该来自book
table。如果 item_type
是 1,item_id
应该来自 food
table.
下面是示例 table。我希望他们能帮助你理解我的问题。
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")
这可以在休眠中实现吗?
您需要为不可继承的连接使用@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
。
我有另一种方法来解决这个问题,即对订单使用继承 table。在您的问题中,您必须放置两种类型的订单和面向对象的方法,这些类型是 BookOrder 和 FoodOrder,它们通过使用单一 Table 继承策略共享相同的 table。
本书class。
@Entity
public class Book {
@Id
@GeneratedValue
private int id;
private String description;
}
食物Class
@Entity
public class Food {
@Id
@GeneratedValue
private int id;
private String field1;
}
让我们创建一个抽象订单class
@MappedSuperclass
public abstract class Order {
@Id
@GeneratedValue
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
现在我们为这个订单table创建两个子class并且我们使用单table继承,所以我们需要提供区分列(这是使用哪个列休眠映射到对象),我们将其定义为 "item_type" 列。
图书订单
@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 table,它再次扩展了订单 table
@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;
}
以上映射创建了您想要的 tables。
我想加入一个 order
table 到一个基于 item_type
价值。如果item_type
是0,item_id
应该来自book
table。如果 item_type
是 1,item_id
应该来自 food
table.
下面是示例 table。我希望他们能帮助你理解我的问题。
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")
这可以在休眠中实现吗?
您需要为不可继承的连接使用@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
。
我有另一种方法来解决这个问题,即对订单使用继承 table。在您的问题中,您必须放置两种类型的订单和面向对象的方法,这些类型是 BookOrder 和 FoodOrder,它们通过使用单一 Table 继承策略共享相同的 table。
本书class。
@Entity
public class Book {
@Id
@GeneratedValue
private int id;
private String description;
}
食物Class
@Entity
public class Food {
@Id
@GeneratedValue
private int id;
private String field1;
}
让我们创建一个抽象订单class
@MappedSuperclass
public abstract class Order {
@Id
@GeneratedValue
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
现在我们为这个订单table创建两个子class并且我们使用单table继承,所以我们需要提供区分列(这是使用哪个列休眠映射到对象),我们将其定义为 "item_type" 列。
图书订单
@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 table,它再次扩展了订单 table
@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;
}
以上映射创建了您想要的 tables。