JPA NamedQuery не найден

#sql-server #jpa #netbeans

#sql-сервер #jpa #netbeans

Вопрос:

Я пытаюсь получить список пользователей, использующих JPA. Каждый раз, когда я запускаю код, я получаю «java.lang.Исключение IllegalArgumentException: NamedQuery имени: Persoon.getAllePersonen не найден.»

Я попытался изменить имя таблицы, заменил Persoon.getAllePersonen на getAllePersonen ,…. Я просто не могу понять, что вызывает ошибку

Persoon

 @Entity
@Table(name = "Persoon")
@NamedQueries({
    @NamedQuery(name = "Persoon.getAllePersonen",
            query = "SELECT p FROM Persoon p"),
    @NamedQuery(name = "Persoon.findByName",
            query = "SELECT p FROM Persoon p WHERE p.achternaam = :persoonNaam OR p.voornaam = :persoonNaam")
})

public class Persoon implements Serializable {
  

PersoonDao

     public List<Persoon> getAlleLeden(){
            TypedQuery<Persoon> queryP = em.createNamedQuery("Persoon.getAllePersonen", Persoon.class);
                  try{ return queryP.getResultList();            
        } catch (NoResultException e){
            throw new EntityNotFoundException("Cannot find leden");
        }
    }
  

Редактировать:

Общий суперкласс DAO

 public class GenericDaoJpa<T>{

    private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("TaijitanPU");

    protected static final EntityManager em = emf.createEntityManager();
  

Persistence.xml

 <?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="TaijitanPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>domein.Persoon</class>
    <class>domein.Graad</class>
    <class>domein.Locatie</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://localhostsqlexpress:1433;databaseName=Taijitan;integratedSecurity=true;"/>
      <property name="javax.persistence.jdbc.user" value=""/>
      <property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
      <property name="javax.persistence.jdbc.password" value=""/>
      <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
    </properties>
  </persistence-unit>
</persistence>
  

Комментарии:

1. (1) Пожалуйста, разместите persistence.xml . (2) Вероятно, у вас утечка ресурсов (вы когда-нибудь закрываетесь emf ?) (3) Обычно менеджеры сущностей должны создаваться на единицу работы, иметь protected static final менеджера сущностей — не лучшая идея

2. @crizzis Я проверил возможные утечки, насколько я могу судить, их нет. Я также добавил persistence.xml код к моему исходному сообщению.

Ответ №1:

Вы должны создать абстрактный класс Generic class и переопределить EntityManager родительского класса для каждого дочернего. Проверьте ниже. Я использовал EJB без состояния для дочерних элементов.

-> РОДИТЕЛЬСКИЙ DAO

 public abstract class AbstractDAO<T> {
...

protected abstract EntityManager getEntityManager();
  

-> ДОЧЕРНИЙ DAO

 @PersistenceContext(unitName = "yourPersistenceUnitName")
private EntityManager em;

@Override
protected EntityManager getEntityManager() {
    return em;
}
  

Комментарии:

1. EntityManager отвечает за Persoon, может ли проблема в том, что я объявляю EntityManager и Factory в общем суперклассе? Я добавил его в редактирование

2. могу ли я увидеть ваш полный «класс persoon DAO»