Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 映射具有多个ID的扩展实体';冬眠_Java_Hibernate_Mapping_Nhibernate Mapping_Jta - Fatal编程技术网

Java 映射具有多个ID的扩展实体';冬眠

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

我已经实现了一个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         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几乎永远都不是一个可用的解决方案。