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

时间:2015-02-15 09:16:31

标签: java sql hibernate orm hibernate-mapping

我想根据order值将book表加入到不同的商品表(fooditem_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")

这可以在休眠中实现吗?

2 个答案:

答案 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可以BookFood加载。

答案 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;

}

上面的映射创建了你想要的表格。