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类 中看到;例如,继承图都使用相同的缓存,并且对公共映射的更改可能在子描述符上可见,尽管我不确定这一点
基本上,我有一个基本 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类 中看到;例如,继承图都使用相同的缓存,并且对公共映射的更改可能在子描述符上可见,尽管我不确定这一点