Vij*_*Nil 3 java jpa eclipselink discriminator
我有一个Client和Affiliate类,继承自Person类.正在使用加入的继承策略类型 - 每个类型与父类共享主键.由于没有鉴别器列,我们选择使用DescriptorCustomizer和ClassExtractor.但它并没有真正理解它是如何工作的,而且,代码似乎没有编译.如果有人用代码片段给出一个很好的例子来理解,那就太好了.
根据上述文件:
如果要映射到现有数据库,并且表没有鉴别器列,则仍可以使用
@ClassExtractor注释或<class-extractor>元素定义继承 .类提取器采用实现ClassExtractor接口的类.此类的实例用于确定要用于数据库行的类类型.类提取器必须定义一个extractClassFromRow()获取数据库Record和的方法Session.
我们需要使用类提取器来定义用户定义的层次结构中的根实体:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@ClassExtractor(PersonClassExtractor.class)
public abstract class Person {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;
private int age;
// ...
}
Run Code Online (Sandbox Code Playgroud)
请注意,我们不使用@Customizer注释,因为在JOINED继承策略的情况下不需要注释:
如果类提取器与
SINGLE_TABLE继承一起使用,则必须能够在查询中过滤类类的行.这可以通过设置onlyInstancesExpression()或withAllSubclassesExpression()分支类来完成.这些可以Expression使用a 设置为对象DescriptorCustomizer.
类提取器必须能够从数据库行确定并返回类类型.通常,我们需要替换鉴别器列,即
假设层次结构中的每个继承实体类型都有一个具有唯一名称的列:
@Entity
public class Client extends Person {
@Column(name = "CLIENT_SPECIFIC")
private String clientSpecific;
// ...
}
@Entity
public class Affiliate extends Person {
@Column(name = "AFFILIATE_SPECIFIC")
private float affiliateSpecific;
// ...
}
Run Code Online (Sandbox Code Playgroud)
类提取器可能如下所示:
public class PersonClassExtractor extends ClassExtractor {
@Override
public Class<?> extractClassFromRow(Record databaseRow, Session session) {
if (databaseRow.containsKey("CLIENT_SPECIFIC")) {
return Client.class;
} else if (databaseRow.containsKey("AFFILIATE_SPECIFIC")) {
return Affiliate.class;
} else {
return Person.class; // this should never happen
}
}
}
Run Code Online (Sandbox Code Playgroud)
List<Person> polymorphicResults = em.createQuery("SELECT p FROM Person p")
.getResultList();
Run Code Online (Sandbox Code Playgroud)
List<Affiliate> concreteResults = em.createQuery("SELECT a FROM Affiliate a")
.getResultList();
List<Client> concreteResults = em.createQuery("SELECT c FROM Client c")
.getResultList();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6842 次 |
| 最近记录: |