首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EJB/Hibernate不访问MySQL数据库

EJB/Hibernate不访问MySQL数据库
EN

Stack Overflow用户
提问于 2017-10-23 21:50:02
回答 1查看 526关注 0票数 0

我正在尝试学习如何使用JavaEE/EJB和数据库持久性,我有一个基本的示例,其中我希望通过输入字段将字符串保存到数据库中,并读取已保存项的列表。

我在本地主机上安装了一个MySQL服务器(V5.7Community Edition),我的测试服务器是Eclipse10.1.0(通过WildFly )。整个项目是一个包含Web和EJB子项目的EAR容器。

我使用的是容器管理的事务,据我所知,当一个方法被调用时,事务会自动创建,并在该方法退出时立即刷新/提交。

问题是,没有数据被写入到实际的数据库中。但是也不会抛出错误。我假设,实体管理器缓存所有假定的存储,并在select时直接读回它们,甚至不检查数据库。因此,当我重新启动服务器时,什么也没有留下。此外,当我直接查看mysql db时,也什么也没有(甚至在wildfly服务器运行时,直接在假定插入之后)。我也尝试过直接将一些行添加到db表中,但select也没有“看到”它们。

因此,在我看来,尽管数据库是在persistence.xml中配置的,但它甚至没有被访问。我尝试删除连接url/用户名/密码,但实际上没有区别,实体管理器仍然没有抛出错误,一切似乎都正常。那么,它到底在哪里保存数据,我必须更改什么才能让它访问提供的mysql数据库呢?

处理程序(在Web项目中):

代码语言:javascript
复制
@ManagedBean(name = "handlerBean")
@SessionScoped
public class HandlerBean {

@EJB
private TodoWorkerBeanRemote worker;

private String input;

public void add() {
    if (input.compareTo("") != 0) {

        TodoBean item = new TodoBean();
        item.setText(input);
        worker.saveItem(item);

        input = "";
    }
}
...

会话Bean /事务容器(在EJB项目中)

代码语言:javascript
复制
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class TodoWorkerBean implements TodoWorkerBeanRemote {

@PersistenceContext(unitName = "EnterpriseTestEJB")
private EntityManager entityManager;

public TodoWorkerBean() {
}

@Override
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) // does not help
public void saveItem(TodoBean item) {

    // entityManager.joinTransaction(); <- does not help
    entityManager.persist(item); // tried .merge() as well
    // entityManager.flush(); <-does not help
}
...

实体Bean (在EJB项目中)

代码语言:javascript
复制
@Entity
@Table(name = "todobean")
@NamedNativeQueries({
    @NamedNativeQuery(name = "TodoBean.getItems", query = "select * from todobean", resultClass = TodoBean.class),
    @NamedNativeQuery(name = "TodoBean.clearItems", query = "delete from todobean") })
public class TodoBean implements Serializable {

private Integer id;
private String text;
...

persistence.xml (也尝试过hibernate.cfg.xml,没有区别)

代码语言:javascript
复制
<?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="EnterpriseTestEJB">
    <class>de.dianasalsa.ejb.TodoBean</class>
    <properties>

        <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
        <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/feedback" /> // not used
        <property name="hibernate.connection.username" value="root" /> // not used
        <property name="hibernate.connection.password" value="root" /> // not used

        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />
        <property name="hibernate.use_sql_comments" value="true" />

        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
        <property name="hibernate.hbm2ddl.auto" value="update" /> // tried "create" as well

    </properties>

</persistence-unit>
</persistence>

日志:

代码语言:javascript
复制
....
15:42:59,602 INFO  [org.jboss.as.jpa] (ServerService Thread Pool -- 66) WFLYJPA0010: Starting Persistence Unit (phase 2 of 2) Service 'EnterpriseTest.ear/EnterpriseTestEJB.jar#EnterpriseTestEJB'
15:42:59,952 INFO  [org.jboss.as.clustering.infinispan] (ServerService Thread Pool -- 65) WFLYCLINF0002: Started client-mappings cache from ejb container
15:42:59,973 INFO  [org.hibernate.dialect.Dialect] (ServerService Thread Pool -- 66) HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
15:43:00,102 INFO  [org.hibernate.envers.boot.internal.EnversServiceImpl] (ServerService Thread Pool -- 66) Envers integration enabled? : true
15:43:00,101 INFO  [org.jboss.as.protocol] (management I/O-1) WFLYPRT0057:  cancelled task by interrupting thread Thread[management-handler-thread - 3,5,management-handler-thread]
15:43:00,604 INFO  [org.hibernate.tool.hbm2ddl.SchemaUpdate] (ServerService Thread Pool -- 66) HHH000228: Running hbm2ddl schema update
15:43:00,617 INFO  [org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl] (ServerService Thread Pool -- 66) HHH000262: Table not found: todobean
15:43:00,619 INFO  [org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl] (ServerService Thread Pool -- 66) HHH000262: Table not found: todobean
15:43:01,499 INFO  [javax.enterprise.resource.webcontainer.jsf.config] (ServerService Thread Pool -- 83) Mojarra 2.2.13.SP1 20160303-1204 für Kontext '/EnterpriseTestWeb' wird initialisiert.
15:43:02,379 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 83) WFLYUT0021: Registered web context: /EnterpriseTestWeb
15:43:02,414 INFO  [org.jboss.as.server] (ServerService Thread Pool -- 34) WFLYSRV0010: Deployed "EnterpriseTest.ear" (runtime-name : "EnterpriseTest.ear")
15:43:02,515 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http management interface listening on http://127.0.0.1:9990/management
15:43:02,519 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on http://127.0.0.1:9990
15:43:02,519 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 10.1.0.Final (WildFly Core 2.2.0.Final) started in 9581ms - Started 879 of 1127 services (422 services are lazy, passive or on-demand)
15:43:18,799 INFO  [org.jboss.ejb.client] (default task-2) JBoss EJB Client version 2.1.4.Final
15:43:32,763 INFO  [stdout] (default task-3) Hibernate: 
15:43:32,763 INFO  [stdout] (default task-3)     /* insert de.dianasalsa.ejb.TodoBean
15:43:32,763 INFO  [stdout] (default task-3)         */ insert 
15:43:32,763 INFO  [stdout] (default task-3)         into
15:43:32,763 INFO  [stdout] (default task-3)             todobean
15:43:32,763 INFO  [stdout] (default task-3)             (text) 
15:43:32,763 INFO  [stdout] (default task-3)         values
15:43:32,764 INFO  [stdout] (default task-3)             (?)

15:43:32,786 INFO  [stdout] (default task-3) Hibernate: 
15:43:32,786 INFO  [stdout] (default task-3)     /* TodoBean.getItems */ select
15:43:32,786 INFO  [stdout] (default task-3)         * 
15:43:32,787 INFO  [stdout] (default task-3)     from
15:43:32,787 INFO  [stdout] (default task-3)         todobean
EN

回答 1

Stack Overflow用户

发布于 2017-11-04 01:52:53

对不起,我的英语...

您需要配置一个名为"jta-data-source“的JNDI,并使用"hibernate.hbm2ddl.auto”创建新关系,如下例所示:

代码语言:javascript
复制
<?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="EnterpriseTestEJB"
        transaction-type="JTA">
        <jta-data-source>java:jboss/datasources/some-name</jta-data-source>
        <properties>
            <property name="hibernate.hbm2ddl.auto" value="create" />
            <property name="hibernate.show_sql" value="true" />
        </properties>
    </persistence-unit>
</persistence>

wildfly有一个"namesever“,你可以使用JNDI名称从你的注释中访问它,比如"@PersistenceContext”。

在Wildfly at selfe中,您必须使用该JNDI名称配置新的MySql连接。

对于MySql连接,下载jdbc driver并将其上传到WildFly。https://dev.mysql.com/downloads/connector/j/5.1.html

Inser MySqgl jdbc Driver

该连接将使用JNDI名称命名(java:jboss/datasources/some name )。

Add new MySql Connection (1)

Add new MySql Connection (2)

当您在Wildfly中运行您的程序时,该程序将在wildfly中查找您的MySql连接的JNDI名称。

如果你想看一个示例代码,我在这里有一个来自我的研究:https://gitlab.com/Java_Project/JavaEE2.0

我希望它能解决你的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46891038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档