Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
Jpa 两个(表/类)继承树之间的双向一对多关系_Jpa_Eclipselink_One To Many_Table Per Class - Fatal编程技术网

Jpa 两个(表/类)继承树之间的双向一对多关系

Jpa 两个(表/类)继承树之间的双向一对多关系,jpa,eclipselink,one-to-many,table-per-class,Jpa,Eclipselink,One To Many,Table Per Class,摘要 比如说,我有两个简单的@Entity继承树(一个抽象基类,每个树中有两个具体的实现类),它们是InheritanceType.TABLE\u PER\u类;我需要一个双向@OneToMany关系,使用@JoinColumn连接基类 这应该会产生四个表,每个混凝土类一个,对吗?EclipseLink为其中一个抽象基类生成第五个表,这对我来说毫无意义。考虑这个例子(这不是真实世界的例子,它只是JPA): 示例 集合是第一个继承树的抽象根,也是@OneToMany关系的实现者: @Entity

摘要

比如说,我有两个简单的@Entity继承树(一个抽象基类,每个树中有两个具体的实现类),它们是InheritanceType.TABLE\u PER\u类;我需要一个双向@OneToMany关系,使用@JoinColumn连接基类

这应该会产生四个表,每个混凝土类一个,对吗?EclipseLink为其中一个抽象基类生成第五个表,这对我来说毫无意义。考虑这个例子(这不是真实世界的例子,它只是JPA):

示例

集合是第一个继承树的抽象根,也是@OneToMany关系的实现者:

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Collection {
    @Id @GeneratedValue
    public long id;
    @OneToMany(mappedBy="collection")
    public List<Media> items = new ArrayList<Media>();
}
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Media {
    @Id
    @GeneratedValue
    public long id;
    @ManyToOne
    @JoinColumn(nullable = false)
    public Collection collection;
}
媒体是第二个继承树的抽象根,也是@ManyToOne关系的实现者:

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Collection {
    @Id @GeneratedValue
    public long id;
    @OneToMany(mappedBy="collection")
    public List<Media> items = new ArrayList<Media>();
}
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Media {
    @Id
    @GeneratedValue
    public long id;
    @ManyToOne
    @JoinColumn(nullable = false)
    public Collection collection;
}
CdMedia和TapeMedia是媒体的具体实现:

@Entity
public class CdMedia extends Media {}

@Entity
public class TapeMedia extends Media {}
结果

正如我所说,EclipseLink将从中生成五个表(不介意序列表):

意外的表介质将具有无用的定义(外键目标在重命名PhysicalCollection时更改语义):

问题

  • 我的预期正确吗?(创建4个表,而不是5个表)
  • 有人能确认这是EclipseLink中的一个bug吗
  • 如果不是bug,你能指出我在哪里犯了错误吗

  • TABLE_PER_类不应该为任何抽象类创建表,因此这是一个bug。很奇怪你没有一张桌子来收集?您确定媒体是抽象的吗?是否错过了重新编译/部署代码

    我知道这个bug存在于EclipseLink 2.0中,但我认为在那之后它已经被修复了,所以你可能想尝试最新版本,否则就记录一个bug


    总的来说,我不推荐每个班级都有一张桌子,尤其是在这种你有很多关系的模式下。最好使用单表或联合继承。

    每个类的表不应该为任何抽象类创建表,因此这是一个bug。很奇怪你没有一张桌子来收集?您确定媒体是抽象的吗?是否错过了重新编译/部署代码

    我知道这个bug存在于EclipseLink 2.0中,但我认为在那之后它已经被修复了,所以你可能想尝试最新版本,否则就记录一个bug


    总的来说,我不推荐每个班级都有一张桌子,尤其是在这种你有很多关系的模式下。最好使用单表或联合继承。

    是的,请放心,我多次检查了重新编译和缓存问题;)。显然,创建媒体是因为它定义了@JoinColumn(这毫无意义),并且由于它试图引用抽象类,所以不能将底层DBs用作外键约束;因此,它错误地映射到某个具体的子类型(这几乎是犯罪;)。与此同时,我发现还有其他人有这个问题[显然eclipselink目前有(v2.4.0)不提供此功能。无论如何,如果JPA实现不可靠地支持每个类的表,则应引发运行时异常,或者至少在出现问题时引发运行时异常。是的,请放心,我多次检查了重新编译和缓存问题;)。显然,创建媒体是因为它定义了@JoinCColumn(这毫无意义),无法将基础DBs用于外键约束,因为它试图引用抽象类;因此它错误地映射到某个具体的子类型(这几乎是犯罪的;)。与此同时,我发现还有其他人有这个问题[显然eclipselink目前有(v2.4.0)不提供此功能。无论如何,如果JPA实现不可靠地支持TABLE_PER_类,则应引发运行时异常,或者至少在出现问题时引发运行时异常。我有一个类似的模型和相同的问题。您是否设法解决了它?我有一个类似的模型和相同的问题。您是否设法解决了解决办法?
    CREATE TABLE `MEDIA` (
        `COLLECTION_ID` bigint(20) NOT NULL,
        KEY `FK_MEDIA_COLLECTION_ID` (`COLLECTION_ID`),
        CONSTRAINT `FK_MEDIA_COLLECTION_ID` FOREIGN KEY (`COLLECTION_ID`) REFERENCES PHYSICALCOLLECTION` (`ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |