#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»