【问题标题】:Does EclipseLink DescriptorCustomizer not support inherited subtypes?EclipseLink DescriptorCustomizer 不支持继承的子类型吗?
【发布时间】:2015-01-27 21:44:05
【问题描述】:

基本上,我有一个将实体描述为不可删除的基类类型。我使用 eclipse 链接的描述符定制器 API 来覆盖默认删除 SQL 并添加附加条件以仅返回非归档实体。

这适用于所有直接扩展 Archiveable 类的类。扩展 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没有选择ArchiveableCustomizerCar确实选择了ArchiveableCustomizer

【问题讨论】:

  • 这是设计使然。当 Archiveable 类是 mappedSuperClass 时,它没有描述符,因此定制器会在拾取它的实体描述符上触发。当涉及到继承时,根有一个描述符并且定制器会触发它,但是每个子类都有自己的描述符,并且需要它们自己的定制器类。
  • @Chris 感谢您的回复。我更新了我的示例,因为它有一个错误。这可能会澄清或改变您的回答。
  • 它没有,并证实了我的解释。 MappedSuperClass 类本身没有描述符,因此从它们中提取所有设置并应用于子类实体描述符。定制器虽然不可继承,并且仅在它们分配给的实体上执行 - 这与适用于子类的 JPA 事件侦听器不同。另请注意,在子类中会看到根实体的一些变化;例如,继承图都使用相同的缓存,对公共映射的更改可能在子描述符上可见,尽管我不确定这一点。
  • @Chris,感谢您的澄清。我发现了一个描述相同问题的 Eclipse 链接错误报告。但是,该项目没有人回应。 bugs.eclipse.org/bugs/show_bug.cgi?id=422232 为什么不继续将您的评论复制到答案中。再次感谢

标签: java jpa eclipselink


【解决方案1】:

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

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

【讨论】:

  • 只是一个后续问题。我将@Customizer 应用于CarType 类,但是,模型应用我的Archiveable 类中指定的附加条件。如果我直接在 CarType 类上指定 @Customizer ,那么可以预期描述符将被正确应用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
相关资源
最近更新 更多