使用命名查询无法找到Singleton EJB中的私有实体

时间:2018-04-24 10:16:40

标签: java oracle jpa ejb

我有一个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。

1 个答案:

答案 0 :(得分:0)

好的,我解决了这个问题,表中有一个列,其中包含以C:/ path / to / avatar开头的动物头像的文件路径,我将其更改为/ path / to / avatar并且它有效。仍然不知道为什么会发生这种情况但现在很好:)