Java EclipseLink描述符是否不支持继承的子类型?

Java EclipseLink描述符是否不支持继承的子类型?,java,jpa,eclipselink,Java,Jpa,Eclipselink,基本上,我有一个基类类型,它将实体描述为不可删除的。我使用EclipseLink的DescriptorCustomizerAPI覆盖默认的deleteSQL,并添加一个额外的条件以仅返回未归档的实体 这适用于直接扩展Archiveable类的所有类。扩展非MappedSuperClass(扩展可架构类)的类不会继承自定义程序。请参见下面的示例: 为了实现它的价值,我使用了EclipseLink 2.5.1 /** * Base Abstract class that implements ar

基本上,我有一个基类类型,它将实体描述为不可删除的。我使用EclipseLink的DescriptorCustomizerAPI覆盖默认的deleteSQL,并添加一个额外的条件以仅返回未归档的实体

这适用于直接扩展Archiveable类的所有类。扩展非MappedSuperClass(扩展可架构类)的类不会继承自定义程序。请参见下面的示例:

为了实现它的价值,我使用了EclipseLink 2.5.1

/**
 * Base Abstract class that implements archiving functionality 
 */ 
@MappedSuperClass
@Customizer(ArchiveableCustomizer.class)
public abstract class Archiveable {

   @NotNull
   @Column(name = "DELETED)
   private Boolean archived = false;    

   // omitted: getters/setters    
}

/**
 * The EclipseLink customizer implementation (followed their docs)
 */ 
public class ArchiveableCustomizer extends DescriptorEventAdapter
        implements DescriptorCustomizer {

     @Override
     public void customize(ClassDescriptor descriptor) throws Exception {
         // omitted: override delete string

         // this is the piece not working
         descriptor.getQueryManager().setAdditionalCriteria("this.archived = false");
     }
}


/**
 * Base class for entities that are stored in the Catalog table. All are archived
 */ 
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TYPE", DiscriminatorType.STRING)
public abstract class Catalog extends Archiveable {
    // omitted: shared columns, not relevant. 
}

/**
 * This class does <b>NOT</b> work
 */
@Entity 
@DiscriminatorValue("CAR_TYPE")
public class CarType extends Catalog {
    // omitted: class details, not relevant
}

/**
 * Class that does not extend the Catalog class but the Archiveable 
 * class directly. This class can be queried correctly with the 
 * additional criteria
 */ 
@Entity
public class Car extends Archiveable { 
     // omitted: clas details, not relevant
}

总之,类CarType不会选择ArchiveableCustomizer。这辆高级轿车确实搭载了ArchiveableCustomizer

在EclipseLink的内部,MappedSuperClass类本身没有描述符,因此所有设置都是从这些类中提取出来的,并应用于子类实体描述符(包括定制器)


通过继承,层次结构中的每个实体都有自己的描述符,并且当映射和其他设置被继承时,描述符定制器只在分配给它们的描述符上执行——在本例中是根。还要注意,在子类中会看到根实体中的一些变化;例如,继承图都使用相同的缓存,对公共映射的更改可能在子描述符上可见,尽管我不确定这一点

这是出于设计。当Archiveable类是mappedSuperClass时,它没有描述符,因此定制程序触发拾取它的实体描述符。当涉及继承时,根有一个描述符,自定义程序在其上激发,但每个子类都有自己的描述符,并且需要自己的自定义程序类。@Chris感谢您的响应。我更新了我的示例,因为它有一个错误。这可能会澄清或改变你的回答,但事实并非如此,也证实了我的解释。MappedSuperClass类本身没有描述符,因此所有设置都从它们中提取并应用于子类实体描述符。但是定制器是不可继承的,并且只在分配给它的实体上执行——这与JPA事件监听器不同,JPA事件监听器适用于子类。还要注意,在子类中会看到根实体中的一些变化;例如,继承图都使用相同的缓存,对公共映射的更改可能在子描述符上可见,尽管我不确定这一点。@Chris,感谢您的澄清。我发现了一个描述相同问题的eclipse链接错误报告。然而,该项目没有人回应。你为什么不把你的评论复制到一个答案上呢。再次感谢您提出的后续问题。我将@Customizer应用于CarType类,但是模型没有应用在我的Archiveable类中指定的附加条件。如果我直接在CarType类上指定@Customizer,那么描述符的应用是否正确?