Этот вопрос касается JPA и дискриминаторов.
Мотивация: я реализую систему с различными полями, для которых потребуются некоторые значения домена. Например, типы для полей (тип пола: мужской и женский; тип удостоверения личности: водительские права; тип авеню и т. д.).
Поскольку моя система управляется метаданными, я не буду создавать эти атрибуты как ENUM. Мне нужно, чтобы они были в легкодоступном месте.
Для этого я создал родительский абстрактный класс ALNDOMAIN (буквенно-цифровые домены). И все унаследованные классы будут частью моих объектов (например, IDType расширяет ALNDomain).
Проблема: в моей системе будет около 200 подклассов ALNDomains. Я не хочу создавать один репозиторий для каждого подкласса. Я бы предпочел иметь один репозиторий в классе ALNDomain и получать значение дискриминатора. Каждый раз, когда я извлекаю свой домен, столбцы дискриминатора становятся нулевыми:
@Entity
@DiscriminatorColumn(name="ALNNAME", discriminatorType = DiscriminatorType.STRING)
public abstract class ALNDomain {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@Column(name="ALNNAME", insertable = false, updatable = false, nullable = false)
private String alnname;
private String value;
private String description;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getAlnname() {
return alnname;
}
public void setAlnname(String alnname) {
this.alnname = alnname;
}
}
Это подкласс:
package com.ang.entity.core;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import com.ang.entity.base.domains.ALNDomain;
@Entity
@DiscriminatorValue("IDTYPE")
public class IDType extends ALNDomain {
}
Это мой репозиторий:
@RepositoryRestResource(collectionResourceRel = "alndomain", path = "alndomain")
@CrossOrigin(maxAge = 3600)
public interface ALNDomainRepository extends PagingAndSortingRepository<ALNDomain, Long>{
List<ALNDomain> findByAlnname(@Param("alnname") String alnname);
}
Когда я обращаюсь к моему репозиторию, столбец дискриминатора имеет значение null. Вот результат:
{
"_embedded" : {
"iDTypes" : [ {
**"alnname" : null,**
"value" : "RG",
"description" : "Registro Nacional",
"_links" : {
"self" : {
"href" : "http://localhost:8080/iDType/1"
},
"iDType" : {
"href" : "http://localhost:8080/iDType/1"
}
}
} ]
},
ALNNAME не должен быть нулевым. Мне это нужно, чтобы не создавать 200 репозиториев для доступа ко всему списку возможных значений для каждого типа ALNDOMAIN.
Спасибо за внимание.