无法使用命名查询找到 Singleton EJB 中的私有实体
Private entity in a Singleton EJB can not be found with a named query
我有一个单例 EJB,它在开始时初始化了两个实体:
@Startup
@Singleton
@Lock(LockType.READ)
public class PetShopSingleton {
@Inject
private AnimalRepository animalRepository;
private Animal cat;
private Animal dog;
@PostConstruct
public void init() {
cat = AnimalRepository.findByType(AnimalType.CAT);
dog = AnimalRepository.findByType(AnimalType.DOG);
}
}
实体从服务运行 命名查询初始化:
@Stateless
public class AnimalRepository extends BaseRepository {
public Animal findByType(AnimalType type) {
Map<String, Object> params = new HashMap<>();
params.put("type", type);
return findOneByNamedQuery("Animal.findByType", params,
Animal.class);
}
}
findOneByNamedQuery 是抽象 BaseRepository 中的一个方法 class:
public <T> T findOneByNamedQuery(String queryName, Map<String, Object> parameters, Class<T> clazz) {
TypedQuery<T> typedQuery = entityManager.createNamedQuery(queryName, clazz);
applyParameters(parameters, typedQuery);
List<T> results = typedQuery.getResultList();
if (!results.isEmpty()) {
return results.get(0);
}
return null;
}
命名查询中使用的可枚举 class 如下所示:
public enum AnimalType {
CAT,
DOG;
}
最后是持久实体:
@Entity
@Table(name = "ANIMALS")
@NamedQueries({
@NamedQuery(
name = "Animal.findByType",
query = "select a from Animal a where a.type = :type"
)
})
public class Animal {
@Enumerated(EnumType.STRING)
private AnimalType type;
public AnimalType getType() {
return type;
}
public void setTyp(AnimalType type) {
this.type = type;
}
}
一个实体(猫)是一个较旧的实体,已在数据库中注册,较新的实体(狗)最近已注册。这里的问题是在 init() 函数中调用的用于查找具有命名查询的两个实体的服务只找到了猫。尽管数据库中有一个条目的 TYPE 列等于 DOG,但狗返回 null。
任何人都可以帮助我或告诉我发生这种情况的可能原因吗?
数据库是 Oracle DB。
OK我解决了问题,table中有一栏动物头像的文件路径以C:/path/to/avatar开头,我把它改成了/path/to/avatar它奏效了。仍然不知道为什么会这样,但现在好了:)
我有一个单例 EJB,它在开始时初始化了两个实体:
@Startup
@Singleton
@Lock(LockType.READ)
public class PetShopSingleton {
@Inject
private AnimalRepository animalRepository;
private Animal cat;
private Animal dog;
@PostConstruct
public void init() {
cat = AnimalRepository.findByType(AnimalType.CAT);
dog = AnimalRepository.findByType(AnimalType.DOG);
}
}
实体从服务运行 命名查询初始化:
@Stateless
public class AnimalRepository extends BaseRepository {
public Animal findByType(AnimalType type) {
Map<String, Object> params = new HashMap<>();
params.put("type", type);
return findOneByNamedQuery("Animal.findByType", params,
Animal.class);
}
}
findOneByNamedQuery 是抽象 BaseRepository 中的一个方法 class:
public <T> T findOneByNamedQuery(String queryName, Map<String, Object> parameters, Class<T> clazz) {
TypedQuery<T> typedQuery = entityManager.createNamedQuery(queryName, clazz);
applyParameters(parameters, typedQuery);
List<T> results = typedQuery.getResultList();
if (!results.isEmpty()) {
return results.get(0);
}
return null;
}
命名查询中使用的可枚举 class 如下所示:
public enum AnimalType {
CAT,
DOG;
}
最后是持久实体:
@Entity
@Table(name = "ANIMALS")
@NamedQueries({
@NamedQuery(
name = "Animal.findByType",
query = "select a from Animal a where a.type = :type"
)
})
public class Animal {
@Enumerated(EnumType.STRING)
private AnimalType type;
public AnimalType getType() {
return type;
}
public void setTyp(AnimalType type) {
this.type = type;
}
}
一个实体(猫)是一个较旧的实体,已在数据库中注册,较新的实体(狗)最近已注册。这里的问题是在 init() 函数中调用的用于查找具有命名查询的两个实体的服务只找到了猫。尽管数据库中有一个条目的 TYPE 列等于 DOG,但狗返回 null。
任何人都可以帮助我或告诉我发生这种情况的可能原因吗?
数据库是 Oracle DB。
OK我解决了问题,table中有一栏动物头像的文件路径以C:/path/to/avatar开头,我把它改成了/path/to/avatar它奏效了。仍然不知道为什么会这样,但现在好了:)