Java 映射具有多个ID的扩展实体';冬眠
我已经实现了一个db,它由物品和水果表组成,具有以下规范:Java 映射具有多个ID的扩展实体';冬眠,java,hibernate,mapping,nhibernate-mapping,jta,Java,Hibernate,Mapping,Nhibernate Mapping,Jta,我已经实现了一个db,它由物品和水果表组成,具有以下规范: 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
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 FROUTS add constraint FK\U FROUT\U ART项目外键(ART\U 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
现在,我的问题是如何在文章和结果中拥有ID,若我保持这种方式,它会引发一个异常,即子类不能包含IDClass,因为它将导致多个ID。感谢您的帮助。提前感谢。它的意思是,一个实体不能有两个ID 以手术为例
entityManager.find(Article.class, 1l);
如果有两篇文章(一篇文章和一个水果)都具有id 1,那么它如何知道返回哪一篇
如果您的表需要每个表都有ID,那么实体继承不是合适的解决方案。考虑把常见的元素放在<代码> @ MappedSuperclass >代码>。如果我定义@ MappedSuperClass,那将意味着文章是抽象的,我不希望这样发生。为什么我不能在一个实体中有两个ID,如果我声明文章的一个实例,它将得到ID1,如果我在之后声明另一个Fruit实例,它将得到ID2和FRU ID1。为什么这么难弄清楚?因为它没有定义findById。如果一个水果有两个ID,hibernate应该用哪一个来找到它?那么,它的主键呢?table Fruit中的ART_ID只是一个将文章属性“绑定”到Fruit实例的辅助键。对不起,它不起作用。这不是Hibernate实现EntityInheritation的方式。要使用EntityInheritation,必须有一个在所有子类中都是唯一的ID。如果您有一个设计好的数据库,而您正试图在其上构建一个hibernate模型,而不是用java创建一个自然域模型并由框架生成DB模式,则EntityInheritation几乎永远都不是一个可用的解决方案。