eclipselink加入表继承导致错误

时间:2014-11-12 20:35:33

标签: java jpa eclipselink

发出的背景: 数据模型是实体钻孔,可以有专门的子类型,如GeotechicalBore,WaterBore,GeothermalBore等。 我开始实施的是:

@Entity(name="BoreHole")
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="BH_TYPE_ID",
discriminatorType=DiscriminatorType.INTEGER)
@DiscriminatorValue("5")
@Table(name="SC.BORE_HOLE")
public class BoreHole implements Serializable {
etc

subclasses are like:
@Entity(name = "GeothermalBore")
@Table(name = "MINERAL.GEOTHERMAL_BORE")
@DiscriminatorValue("8")
@PrimaryKeyJoinColumn(name="BH_ID",referencedColumnName="BH_ID")
public class GeothermalBore extends BoreHole{

@Entity(name = "PetroleumBore")
@Table(name = "PETROLEUM.PETROLEUM_BORE")
@DiscriminatorValue("1")
@PrimaryKeyJoinColumn(name="BH_ID",referencedColumnName="BH_ID")
public class PetroleumBore extends BoreHole{

所有重要的访问都是通过以下代码:

        EntityManagerFactory emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
        EntityManager em = emf.createEntityManager();
        TypedQuery<BoreHole> q = em.createQuery("SELECT x FROM BoreHole x where x.name = '" + name + "'", BoreHole.class);
        List<BoreHole> bhList = q.getResultList();

大部分都有效,但并非所有课程都适用。例如上面有石油钻井公司,但GeothermalBore没有。我收到了错误:

javax.persistence.PersistenceException: Exception [EclipseLink-43] (Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Missing class for indicator field value [8] of type [class java.lang.Integer].
Descriptor: RelationalDescriptor(nz.cri.gns.jpaDatabase.entities.BoreHole.BoreHole --> [DatabaseTable(SC.BORE_HOLE)])

肯定有一个鉴别器值为8的类,它位于persistance.xml中。

在这一点上,情况迅速发生了变化。为了尝试跟踪工作的子类和没有工作的子类之间的区别,我将子类放在基础钻孔的相同包中。无论如何,这似乎是更好的做法。当我这样做时,我得到了这种行为:

    TypedQuery<BoreHole> q = em.createQuery("SELECT x FROM BoreHole x where x.name = '" + name + "'", BoreHole.class);

生成类似

的SQL
SELECT BH_ID, BH_TYPE_ID, etc FROM SC.BORE_HOLE WHERE((BH_NAME = ?) AND (BH_TYPE_ID =))"))

但它总是绑定基础钻孔等级的鉴别器值。 (值5)。即它正在选择BoreHole的特定实例 不是任何子类。我是JPA的诺布,但这看起来像是全部 我见过的例子。

落后的步骤。下一步是如何使BoreHole成为一个抽象类并将所有钻孔作为子类派生? 即:

@Entity(name="BoreHole")
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="BH_TYPE_ID", discriminatorType=DiscriminatorType.INTEGER)
@Table(name="SC.BORE_HOLE")
public abstract class BoreHole implements Serializable {

以前的子实体。 完全失败。我现在得到这些错误:

Exception [EclipseLink-108] (Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Cannot find value in class indicator mapping in parent descriptor [null].
Descriptor: RelationalDescriptor(nz.cri.gns.jpaDatabase.entities.BoreHole.BoreHole --> [DatabaseTable(SC.BORE_HOLE)])

Exception [EclipseLink-41] (Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: A non-read-only mapping must be defined for the sequence number field.
Descriptor: RelationalDescriptor(nz.cri.gns.jpaDatabase.entities.BoreHole.BoreHole --> [DatabaseTable(SC.BORE_HOLE)]) 

我倒退了,而不是前锋,互联网上的类似问题似乎没有得到答复。

1 个答案:

答案 0 :(得分:0)

非常感谢克里斯的小费。我确实查看了日志,但正在寻找错误。按照建议做的事情让我在persistence.xml中跟踪问题大写错误我觉得它一定很简单,但是在错误的地方寻找拼写错误。

经过3天没有进展,一切都很好。

相关问题