EclipseLink DescriptorCustomizer 不支持继承的子类型吗?

Does EclipseLink DescriptorCustomizer not support inherited subtypes?

基本上,我有一个基本 class 类型,它将实体描述为不可删除。我使用 eclipse link 的描述符定制器 API 覆盖默认删除 SQL 并仅向 return 非存档实体添加附加条件。

这适用于直接扩展 Archiveable class 的所有 classes。 类 扩展非 MappedSuperClass,扩展 Archiveable class 不继承定制器。请参阅下面的示例:

不管怎样,我使用的是 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
}

综上所述,classCarType没有ArchiveableCustomizer。 class Car 确实 获得了 ArchiveableCustomizer

在 EclipseLink 的内部,MappedSuperClass 类 本身没有描述符,因此所有设置都从它们中提取并应用于子类实体描述符 - 包括定制器。

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