我有一个访问MySQL数据库的REST服务。我正在使用Wildfly 10和MySQL 5.7.12。我试图将EntityManager作为注入,并且在为我的实体映射表内容执行find
方法时出现以下错误。
org.h2.jdbc.JdbcSQLException: Table "MYTABLE" not found; SQL statement:
在RESTService类中我有
@PersistenceContext(unitName="myUnit")
protected EntityManager entityManager;
我的persistence.xml文件是:
<?xml version="1.0" encoding="UTF-8"?>
<persistence 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"
version="2.1">
<persistence-unit name="myUnit">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/mytable" />
<property name="javax.persistence.jdbc.user" value="user" />
<property name="javax.persistence.jdbc.password" value="pass" />
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.archive.autodetection" value="class, hbm"/>
</properties>
</persistence-unit>
</persistence>
问题在于,如果不是使用注入,而是使用手动方式检索实体管理器,一切都工作得很顺利。
EntityManagerFactory emFactory;
emFactory = Persistence.createEntityManagerFactory("myUnit");
EntityManager em = emFactory.createEntityManager();
你能给我一些关于如何使用PersistenceContext的提示吗?代码有点干净,我更喜欢使用它。
答案 0 :(得分:0)
看起来您正在获取在持久性单元中注入的默认数据源,因此我猜这取决于EntityManager是如何构建的#39;。解决此问题的一种方法是在WidFly中创建数据源,并在持久性单元中使用它(通过)其JNDI名称。 随意报告错误http://issues.jboss.org/
答案 1 :(得分:0)
您正在设置RESOURCE_LOCAL持久性单元。你应该这样配置:
<persistence-unit transaction-type="RESOURCE_LOCAL">
为了使用资源本地持久性单元,您不能注入EntityManager,只能注入EntityManagerFactory。如果切换到JTA数据源并让服务器管理它,你最终会减少很少的管道。
如果您绝对不想编辑standalone.xml,无论如何都可以在WF8中将yourdatasource-ds.xml文件放入WEB-INF文件夹,或放在.war文件旁边的deployments目录中。有人说过要从WF中删除它,所以我不知道它是否适用于10.x。