在Hibernate中映射具有多个ID的扩展实体

时间:2012-05-04 19:48:41

标签: java hibernate mapping nhibernate-mapping jta

我已经实现了一个db,它由Article和Fruit表组成,具有以下规范:

create table Fruit
(
ART_ID            bigint,
FRU_ID          bigint not null auto_increment,
FRU_FROZEN   varchar(15),
primary key(FRU_ID)
);

# Implemented

create table Article
(
ART_ID            bigint,
ART_NAME         varchar(10) not null,
ART_COST   varchar(10) not null,
primary key(ART_ID)
);

alter table Fruits添加约束FK_FRUIT_ARTICLE外键(ART_ID) 引用文章(ART_ID)关于删除限制更新限制;

以及以下类实体: Article.java

@Entity      
@Table(name = "Article")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Article implements Serializable
 {
@Id @GeneratedValue(strategy=GenerationType.AUTO)
@Basic(optional = false)
@Column(name = "ART_ID")
private Long id;

@Basic(optional = false)
@Column(name = "ART_NAME")
private String name;

@Basic(optional = true)
@Column(name = "ART_COST")
private String cost; 

//构造函数,getter和setter

Fruit.java

@Entity
@Table(name="Fruit")
public class Fruit extends Article{


@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "FRU_ID")
private long fruitID;

@Basic(optional = false)
@Column(name = "FRU_FROZEN")
private String fruitFrozen;

//构造函数,getter和setter

现在,我的问题是如何在Article和Fruit中使用ID,如果我这样保留它,它会抛出异常,即子类不能包含IDClass,因为它会产生多个ID。任何帮助表示赞赏。提前谢谢。

1 个答案:

答案 0 :(得分:2)

这意味着它所说的,实体不能有两个ID。

考虑操作

entityManager.find(Article.class, 1l);

如果有两篇文章(一篇文章和一篇水果)都有id 1,那该怎么知道要返回哪一篇?

如果您的表需要每个都有ID,则实体继承不是合适的解决方案。考虑将公共元素放在@MappedSuperclass中。