如何将父项 table 与两个不相关的子项 table 相关联

How to associate a parent table with two unrelated Child tables

我想加入一个 order table 到一个基于 item_type 价值。如果item_type是0,item_id应该来自booktable。如果 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 可以加载为 BookFood

我有另一种方法来解决这个问题,即对订单使用继承 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。