Ошибка при создании EntityManager в JPA2

Я пытаюсь создать простое приложение JPA2, которое сохраняет что-то в базе данных, используя реализацию OpenJPA. Я запускаю Derby и использую встроенный драйвер JDBC по умолчанию. Я ломал голову над этим, пытаясь понять, чего не хватает. Я уверен, что это что-то тривиальное, но если бы кто-то мог просмотреть это и указать мне правильное направление, я был бы очень благодарен. Спасибо.

Вот мой файл persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence
EntityManagerFactory emf = Persistence.createEntityManagerFactory("HelloWorld");
EntityManager em = emf.createEntityManager();
0.xsd"> <persistence-unit name="HelloWorld"> <jta-data-source>java:comp/env/StuffDerby</jta-data-source> <class>helloworld.entities.Employee</class> </persistence-unit> </persistence>

и когда я запускаю этот код:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("HelloWorld");
EntityManager em = emf.createEntityManager();

При вызове метода createEntityManager() происходит сбой.

406  HelloWorld  INFO   [WebContainer : 0] openjpa.Runtime - Starting OpenJPA 2.0.0
[1/11/11 12:46:21:377 PST] 0000002f servlet       E com.ibm.ws.webcontainer.servlet.ServletWrapper service SRVE0068E: Uncaught exception created in one of the service methods of the servlet HelloServlet in application HelloWorld. Exception created : <openjpa-2.0.0-r422266:935683 nonfatal general error> org.apache.openjpa.persistence.PersistenceException: java.lang.String incompatible with javax.sql.DataSource
    at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:208)
    at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:156)
    at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:213)
    at com.ibm.ws.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:45)
    at com.ibm.ws.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:30)
    at helloworld.entities.controller.EmployeeManager.getEntityManager(EmployeeManager.java:37)
    at helloworld.entities.controller.EmployeeManager.getEmployee(EmployeeManager.java:188)
    at helloworld.HelloServlet.doGet(HelloServlet.java:47)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:718)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1661)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1595)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:131)
    at com.ibm.ws.osgi.web.extender.OsgiDirectoryProtectionFilter.doFilter(OsgiDirectoryProtectionFilter.java:94)
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:188)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:116)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:77)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:908)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:932)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:500)
    at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
    at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3826)
    at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:276)
    at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:931)
    at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1583)
    at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:186)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:455)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:384)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:272)
    at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214)
    at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113)
    at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
    at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
    at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
    at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
    at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
    at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
    at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1550)
Caused by: java.lang.ClassCastException: java.lang.String incompatible with javax.sql.DataSource
    at org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.createConnectionFactory(JDBCConfigurationImpl.java:834)
    at org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.getDBDictionaryInstance(JDBCConfigurationImpl.java:594)
    at org.apache.openjpa.jdbc.meta.MappingRepository.endConfiguration(MappingRepository.java:1489)
    at org.apache.openjpa.lib.conf.Configurations.configureInstance(Configurations.java:507)
    at org.apache.openjpa.lib.conf.Configurations.configureInstance(Configurations.java:432)
    at org.apache.openjpa.lib.conf.PluginValue.instantiate(PluginValue.java:104)
    at org.apache.openjpa.conf.MetaDataRepositoryValue.instantiate(MetaDataRepositoryValue.java:68)
    at org.apache.openjpa.lib.conf.ObjectValue.instantiate(ObjectValue.java:83)
    at org.apache.openjpa.conf.OpenJPAConfigurationImpl.newMetaDataRepositoryInstance(OpenJPAConfigurationImpl.java:939)
    at org.apache.openjpa.conf.OpenJPAConfigurationImpl.getMetaDataRepositoryInstance(OpenJPAConfigurationImpl.java:930)
    at org.apache.openjpa.kernel.AbstractBrokerFactory.makeReadOnly(AbstractBrokerFactory.java:626)
    at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:193)
    ... 38 more

person stuff22    schedule 11.01.2011    source источник
comment
мне кажется, что ссылка на jndi - это строка, а не источник данных. Вы уверены, что в бите населения jndi вы не помещаете строку со ссылкой jndi на источник данных, а не результат поиска этого имени (вы не публикуете его, поэтому я не вижу). Должна быть какая-то j2ee тарабарщина о ссылке на ресурс или что-то в этом роде.   -  person time4tea    schedule 12.01.2011


Ответы (1)


org.apache.openjpa.persistence.PersistenceException: 
    java.lang.String incompatible with javax.sql.DataSource

Другими словами, java:comp/env/StuffDerby указывает на java.lang.String вместо java.sql.DataSource. Исправьте это соответствующим образом в конфигурации сервера.

person BalusC    schedule 11.01.2011
comment
Разве источник данных не определен в каком-то XML-файле, и AS должен его создать? - person Bozho; 12.01.2011
comment
Действительно, обычно он определяется как ресурс JNDI, где вы можете указать полное доменное имя в качестве типа ресурса. Это можно сделать либо с помощью XML-файла в веб-приложении, либо с помощью веб-администратора. Вероятно, полное доменное имя было java.lang.String вместо java.sql.DataSource. Если нет, то это, вероятно, ошибка в AS. - person BalusC; 12.01.2011
comment
ага.. У меня выработалась привычка сразу предполагать ошибку в AS. И я не использовал AS в производственном проекте. - person Bozho; 12.01.2011
comment
нашел это в моем webapp.xml ‹env-entry› ‹env-entry-name›StuffDerby‹/env-entry-name› ‹env-entry-type›java.lang.String‹/env-entry-type› ‹env -entry-value› ... ‹/env-entry-value› ‹/env-entry›. Хотя это не позволяет вам изменить его на тип DataSource. - person stuff22; 12.01.2011
comment
Смотри, вот и преступник. Исправьте/измените его, чтобы вы могли изменить его. Трудно только дать подробную помощь по этому поводу, так как неясно, что именно это такое. Это тот самый? Это подруга Пеннивайза? Вы можете подумать о том, чтобы задать новый вопрос, если вы действительно не можете понять его. - person BalusC; 12.01.2011
comment
Извините, это схема xsl для web.xml (не webapp.xml). ‹env-entry-type› не может быть java.sql.DataSource. - person stuff22; 12.01.2011
comment
Что такое <env-entry-value>? Источник данных? Если подумать, хотя я больше не занимаюсь Websphere, но я ожидаю, что это будет <res-type> или что-то в этом роде, где вам нужно указать java.sql.DataSoruce. - person BalusC; 12.01.2011
comment
В итоге я удалил это из web.xml. Он был помещен туда IBM RAD, когда я добавил в проект аспект JPA. В итоге просто использовал JNDI для получения источника данных. Теперь это работает. Спасибо, что указали мне правильное направление. - person stuff22; 12.01.2011