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