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
Inheritance JPA中单_表策略的继承和getter中的@Discriminator_Inheritance_Jpa_Entity_Getter_Discriminator - Fatal编程技术网

Inheritance JPA中单_表策略的继承和getter中的@Discriminator

Inheritance JPA中单_表策略的继承和getter中的@Discriminator,inheritance,jpa,entity,getter,discriminator,Inheritance,Jpa,Entity,Getter,Discriminator,使用单表策略的JPA实体中存在继承问题。在getters@Discriminator中,减少继承范围 我的结构如下: @Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name="type") @DiscriminatorValue("A") class A { ... } @Entity @DiscriminatorValue("B") class B extends A { ..

使用单表策略的JPA实体中存在继承问题。在getters@Discriminator中,减少继承范围

我的结构如下:

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="type")
@DiscriminatorValue("A")
class A {
...
}

@Entity
@DiscriminatorValue("B")
class B extends A {
...
}

@Entity
@DiscriminatorValue("C")
class C extends B {
...
}

@Entity
class Something{
@ManyToMany // blah blah
private List<B> listB; // getters and setters
}
问题是这个getter(Something.getListB)只将这个列表减少到类B(通过鉴别器B)。这导致对象类C不在列表中。它是由@Discriminator通过指示严格类型“t1.type=B”引起的。它不允许在那里放置像“t1.type IN(B,C)”这样的集合/列表

自定义JPQL查询以不同的方式构造:

SELECT t1.id, t1.type, t1.sys_modified_date, t1.sys_created_date, t1.name,  t1.shortName
FROM something_b t0 INNER JOIN A t1 ON t0.listB = t1.id 
WHERE t0.news = ? AND t1.type IN (?, ?) 
[params=(long) 205, (String) B, (String) C]
他们应该怎么做就怎么做。但是盖特呢

有趣的是,当我将某个类从B类更改为A类(基本类)时: @实体 分类{ @很多//诸如此类 私有列表listA;//getter和setter }

这就解决了问题。在查询中的getter中:

SELECT t1.id, t1.type, t1.sys_modified_date, t1.sys_created_date, t1.name,  t1.shortName
FROM something_b t0 INNER JOIN A t1 ON t0.listB = t1.id 
WHERE t0.news = ? 
[params=(long) 205]
“和t1.type=?”不相似。它可以工作,但会干扰从“真实世界对象”到“ORM实体”的映射。解决方案改变了,使抽象变得更糟。这不是一个优雅的解决方案

问题:

我怎样才能解决这个问题

我可以在getter中使用自定义JPQL查询吗

如何强制getter获取B和C对象


您是否有其他建议,而不是将列表更改为列表???

您使用的JPA提供商是什么?听起来像个虫子。这应该适用于EclipseLink。

我们在2.1.0版中使用OpenJPA。您是否有与其他JPA提供商合作的经验?
SELECT t1.id, t1.type, t1.sys_modified_date, t1.sys_created_date, t1.name,  t1.shortName
FROM something_b t0 INNER JOIN A t1 ON t0.listB = t1.id 
WHERE t0.news = ? AND t1.type IN (?, ?) 
[params=(long) 205, (String) B, (String) C]
SELECT t1.id, t1.type, t1.sys_modified_date, t1.sys_created_date, t1.name,  t1.shortName
FROM something_b t0 INNER JOIN A t1 ON t0.listB = t1.id 
WHERE t0.news = ? 
[params=(long) 205]