【问题标题】:Entities not being created in the Database未在数据库中创建实体
【发布时间】:2012-03-11 22:10:34
【问题描述】:

让 EJB 工作的传奇故事的下一部分希望有人能帮助我

这是我的服务器日志,显示我的部署成功:

2012-03-11 22:02:41,837 INFO  [org.jboss.web.tomcat.service.deployers.TomcatDeployment] (HDScanner) undeploy, ctxPath=/SE2-war
2012-03-11 22:02:41,882 INFO  [org.jboss.jpa.deployment.PersistenceUnitDeployment] (HDScanner) Stopping persistence unit persistence.unit:unitName=SE2.ear/SE2-ejb.jar#wvp08heuPU
2012-03-11 22:02:42,429 WARN  [org.jboss.ejb3.interceptor.InterceptorInfoRepository] (HDScanner) EJBTHREE-1852: InterceptorInfoRepository is deprecated
2012-03-11 22:02:42,650 INFO  [org.jboss.profileservice.management.upload.remoting.DeployHandler] (WorkerThread#0[127.0.0.1:3125]) invoke, payload: {DeploymentTargetID=names=[SE2.ear], clientAddress=/127.0.0.1}, parameter: start
2012-03-11 22:02:42,900 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (HDScanner) Created KernelDeployment for: SE2-ejb.jar
2012-03-11 22:02:42,901 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (HDScanner) installing bean: jboss.j2ee:ear=SE2.ear,jar=SE2-ejb.jar,name=NewSessionBean,service=EJB3
2012-03-11 22:02:42,901 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (HDScanner)   with dependencies:
2012-03-11 22:02:42,901 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (HDScanner)   and demands:
2012-03-11 22:02:42,902 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (HDScanner)  jboss-switchboard:appName=SE2,module=SE2-ejb,name=NewSessionBean; Required: Create
2012-03-11 22:02:42,902 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (HDScanner)  jboss.ejb:service=EJBTimerService; Required: Described
2012-03-11 22:02:42,902 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (HDScanner)   and supplies:
2012-03-11 22:02:42,903 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (HDScanner)  Class:ejb.NewSessionBeanRemote
2012-03-11 22:02:42,903 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (HDScanner)  jndi:NewSessionBean
2012-03-11 22:02:42,903 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (HDScanner)  jndi:SE2/NewSessionBean/remote-ejb.NewSessionBeanRemote
2012-03-11 22:02:42,903 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (HDScanner)  jndi:SE2/NewSessionBean/remote
2012-03-11 22:02:42,904 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (HDScanner) Added bean(jboss.j2ee:ear=SE2.ear,jar=SE2-ejb.jar,name=NewSessionBean,service=EJB3) to KernelDeployment of: SE2-ejb.jar
2012-03-11 22:02:42,980 INFO  [org.jboss.ejb3.session.SessionSpecContainer] (HDScanner) Starting jboss.j2ee:ear=SE2.ear,jar=SE2-ejb.jar,name=NewSessionBean,service=EJB3
2012-03-11 22:02:43,054 INFO  [org.jboss.ejb3.EJBContainer] (HDScanner) STARTED EJB: ejb.NewSessionBean ejbName: NewSessionBean
2012-03-11 22:02:43,410 INFO  [org.jboss.ejb3.proxy.impl.jndiregistrar.JndiSessionRegistrarBase] (HDScanner) Binding the following Entries in Global JNDI:

    SE2/NewSessionBean/remote - EJB3.x Default Remote Business Interface
    SE2/NewSessionBean/remote-ejb.NewSessionBeanRemote - EJB3.x Remote Business Interface

2012-03-11 22:02:43,411 WARN  [org.jboss.ejb3.TimerServiceContainer] (HDScanner) EJBTHREE-2193: using deprecated TimerServiceFactory for restoring timers
2012-03-11 22:02:43,424 INFO  [org.jboss.jpa.deployment.PersistenceUnitDeployment] (HDScanner) Starting persistence unit persistence.unit:unitName=SE2.ear/SE2-ejb.jar#wvp08heuPU
2012-03-11 22:02:43,454 INFO  [org.jboss.web.tomcat.service.deployers.TomcatDeployment] (HDScanner) deploy, ctxPath=/SE2-war
2012-03-11 22:02:43,561 INFO  [org.jboss.web.tomcat.service.deployers.TomcatDeployment] (WorkerThread#0[127.0.0.1:3125]) undeploy, ctxPath=/SE2-war
2012-03-11 22:02:43,621 INFO  [org.jboss.jpa.deployment.PersistenceUnitDeployment] (WorkerThread#0[127.0.0.1:3125]) Stopping persistence unit persistence.unit:unitName=SE2.ear/SE2-ejb.jar#wvp08heuPU
2012-03-11 22:02:43,629 INFO  [org.jboss.ejb3.session.SessionSpecContainer] (WorkerThread#0[127.0.0.1:3125]) Stopping jboss.j2ee:ear=SE2.ear,jar=SE2-ejb.jar,name=NewSessionBean,service=EJB3
2012-03-11 22:02:43,781 INFO  [org.jboss.ejb3.EJBContainer] (WorkerThread#0[127.0.0.1:3125]) STOPPED EJB: ejb.NewSessionBean ejbName: NewSessionBean
2012-03-11 22:02:44,394 WARN  [org.jboss.ejb3.interceptor.InterceptorInfoRepository] (WorkerThread#0[127.0.0.1:3125]) EJBTHREE-1852: InterceptorInfoRepository is deprecated
2012-03-11 22:02:44,418 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (WorkerThread#0[127.0.0.1:3125]) Created KernelDeployment for: SE2-ejb.jar
2012-03-11 22:02:44,425 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (WorkerThread#0[127.0.0.1:3125]) installing bean: jboss.j2ee:ear=SE2.ear,jar=SE2-ejb.jar,name=NewSessionBean,service=EJB3
2012-03-11 22:02:44,426 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (WorkerThread#0[127.0.0.1:3125])   with dependencies:
2012-03-11 22:02:44,426 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (WorkerThread#0[127.0.0.1:3125])   and demands:
2012-03-11 22:02:44,426 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (WorkerThread#0[127.0.0.1:3125])     jboss-switchboard:appName=SE2,module=SE2-ejb,name=NewSessionBean; Required: Create
2012-03-11 22:02:44,426 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (WorkerThread#0[127.0.0.1:3125])     jboss.ejb:service=EJBTimerService; Required: Described
2012-03-11 22:02:44,427 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (WorkerThread#0[127.0.0.1:3125])   and supplies:
2012-03-11 22:02:44,427 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (WorkerThread#0[127.0.0.1:3125])     Class:ejb.NewSessionBeanRemote
2012-03-11 22:02:44,427 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (WorkerThread#0[127.0.0.1:3125])     jndi:NewSessionBean
2012-03-11 22:02:44,427 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (WorkerThread#0[127.0.0.1:3125])     jndi:SE2/NewSessionBean/remote-ejb.NewSessionBeanRemote
2012-03-11 22:02:44,427 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (WorkerThread#0[127.0.0.1:3125])     jndi:SE2/NewSessionBean/remote
2012-03-11 22:02:44,428 INFO  [org.jboss.ejb3.deployers.JBossASKernel] (WorkerThread#0[127.0.0.1:3125]) Added bean(jboss.j2ee:ear=SE2.ear,jar=SE2-ejb.jar,name=NewSessionBean,service=EJB3) to KernelDeployment of: SE2-ejb.jar
2012-03-11 22:02:44,466 INFO  [org.jboss.ejb3.session.SessionSpecContainer] (WorkerThread#0[127.0.0.1:3125]) Starting jboss.j2ee:ear=SE2.ear,jar=SE2-ejb.jar,name=NewSessionBean,service=EJB3
2012-03-11 22:02:44,467 INFO  [org.jboss.ejb3.EJBContainer] (WorkerThread#0[127.0.0.1:3125]) STARTED EJB: ejb.NewSessionBean ejbName: NewSessionBean
2012-03-11 22:02:44,475 INFO  [org.jboss.ejb3.proxy.impl.jndiregistrar.JndiSessionRegistrarBase] (WorkerThread#0[127.0.0.1:3125]) Binding the following Entries in Global JNDI:

    SE2/NewSessionBean/remote - EJB3.x Default Remote Business Interface
    SE2/NewSessionBean/remote-ejb.NewSessionBeanRemote - EJB3.x Remote Business Interface

2012-03-11 22:02:44,477 WARN  [org.jboss.ejb3.TimerServiceContainer] (WorkerThread#0[127.0.0.1:3125]) EJBTHREE-2193: using deprecated TimerServiceFactory for restoring timers
2012-03-11 22:02:44,484 INFO  [org.jboss.jpa.deployment.PersistenceUnitDeployment] (WorkerThread#0[127.0.0.1:3125]) Starting persistence unit persistence.unit:unitName=SE2.ear/SE2-ejb.jar#wvp08heuPU
2012-03-11 22:02:44,529 INFO  [org.jboss.web.tomcat.service.deployers.TomcatDeployment] (WorkerThread#0[127.0.0.1:3125]) deploy, ctxPath=/SE2-war

这是我的持久性单元及其上下文:

<?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_2_0.xsd">
  <persistence-unit name="wvp08heuPU" transaction-type="JTA">
    <provider>oracle.toplink.essentials.PersistenceProvider</provider>
    <jta-data-source>java:/MYSQL</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="toplink.ddl-generation" value="create-tables"/>
    </properties>
  </persistence-unit>
</persistence>

这是我的问题:查看我的数据库,我没有持久化实体 - 下面的代码显示了我的实体:

包装实体;

import java.io.Serializable;
import java.util.Calendar;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.UniqueConstraint;

@Entity
@Table(name="Account", uniqueConstraints=@UniqueConstraint(columnNames="email"))
public class Account implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int account_id;

    private String email;
    private String name;
    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
    private Calendar dateCreated;
    private int status;
    private String password;
    private String bio;
    private String profilePictureURL;

//getters and setters
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (int) account_id;
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Account)) {
            return false;
        }
        Account other = (Account) object;
        if (this.account_id != other.account_id) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entities.Account[ id=" + account_id + " ]";
    }

}

有什么想法吗?

编辑:

我的会话 bean:

package ejb;

import entities.Account;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class NewSessionBean implements NewSessionBeanRemote {

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

    @Override
    public void AddAccount(Account a){
        em.persist(a);
    }
}

解决方案:

主要问题是:我的持久层无法在数据库上创建表,因为没有该功能

正如 Oscar 指出的那样,为了解决我的真正问题,我将持久性提供程序更改为 Hibernate 2.0 - 这与各种更改列表一起使我的 EJB 能够工作。

我遇到的几个问题你可能也想解决:

  • ClassNotFound 异常 - 将持久性 .jar 文件移动到 JBoss 6 服务器的 server/default 目录

  • 无法强制转换类 - 使用 EclipseLink 和 JBoss 6 时似乎 有一些兼容性问题,我无法让它工作; 我不会费心去尝试。

  • 未找到 MYSQL - 确保您只有一个 mysql 连接器驱动程序 不仅在您的 JBoss libs 文件夹中列出,而且在 netbeans 中列出。 你可以使用 SET claspath 来默认这个,谷歌会告诉你 其余的。

【问题讨论】:

  • @Column(unique=true) private String email; 足以满足简单的约束。
  • 感谢 viktor - 我知道有一种方法可以将其作为类主体的一部分,但该方法也有效。对我的实际问题有什么想法吗?

标签: java mysql netbeans ejb jboss6.x


【解决方案1】:

entityManager.persist(account); 的电话在哪里?应该存在一个负责持久化实体的业务组件,无论是会话 EJB 还是 POJO。

【讨论】:

  • 嗨 Oscar - 你的权利,我应该打电话给我,我已经用我的 Session Bean(它具有持久部分)编辑了我的上述问题。不管怎样,如果我没有弄错,即使我没有调用实体管理器,表仍然应该在数据库中创建?无论如何,我以前就是这样做的……但那是在 JBoss 7 上。
  • 您的问题具有误导性,标题为“实体不持久”;现在——如果我理解正确的话——问题是表没有在数据库中创建,而不是它们不能被持久化。请查看此post,了解有关如何解决您的问题的更多详细信息。
  • 嗨,奥斯卡 - 再次感谢您的回复。您的权利当然应该是“EJB:未在数据库中创建实体”您的回答帮助我更好地理解了这个问题。为了让持久性提供程序为我创建我的表,我不能使用 TopLink Essentials,因为它不支持这一点。相反,它可以用于为您手动制作 ddl 文件。如果您追求与我相同的功能,我会选择休眠 2.0,因为这最终是我设法让我的 ejb 工作的方法。
  • @LewisWheeler 对,在休眠表创建中与persistence.xml 中的这一行无缝协作:&lt;property name="hibernate.hbm2ddl.auto" value="???"/&gt; 其中??? 可以是here 中解释的任何值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 2017-04-19
相关资源
最近更新 更多