我有一个Singleton 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类中的一个方法:
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;
}
命名查询中使用的可枚举类如下所示:
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;
}
}
一个实体(cat)是较旧的实体,并且已在数据库中注册,最近一个实体(狗)已注册。这里的问题是在init()函数中调用的服务用于查找具有命名查询的两个实体仅查找cat。尽管数据库中有一个TYPE列等于DOG的条目,但狗返回null。
任何人都可以帮助我或告诉我为什么会发生这种情况的原因吗?
数据库是Oracle DB。
答案 0 :(得分:0)
好的,我解决了这个问题,表中有一个列,其中包含以C:/ path / to / avatar开头的动物头像的文件路径,我将其更改为/ path / to / avatar并且它有效。仍然不知道为什么会发生这种情况但现在很好:)