2013-12-09 60 views
1

我想從註釋的EJB實體創建數據庫。 使用:Eclipse,Ant工具,Apache Tomee服務器,OpenJPA,JEE/EJB's,MySQL db。OpenJPA不從EJB實體生成/映射數據庫表

我的應用程序在注入實體管理器(假設觸發註釋實體類後的db創建)期間失敗。一些關鍵的應用程序部分:

異常我得到這個樣子的:

prepare-database: 
    [echo] Inserting default user into database. 
    [java] Dec 09, 2013 9:45:29 AM org.apache.openejb.client.EventLogger log 
    [java] INFO: RemoteInitialContextCreated{providerUri=http://127.0.0.1:8080/tomee/ejb} 
    [java] Bean found 
    [java] Exception in thread "main" javax.ejb.EJBException: The bean encountered a non-application exception; nested exception is: 
    [java]  <openjpa-2.2.0-r422266:1244990 nonfatal general error> org.apache.openjpa.persistence.PersistenceException: There were errors initializing your configuration: <openjpa-2.2.0-r422266:1244990 fatal user error> org.apache.openjpa.util.UserException: A connection could not be obtained for driver class "null" and URL "null". You may have specified an invalid URL. 
    [java]  at org.apache.openjpa.jdbc.schema.DataSourceFactory.newConnectException(DataSourceFactory.java:255) 
    [java]  at org.apache.openjpa.jdbc.schema.DataSourceFactory.installDBDictionary(DataSourceFactory.java:241) 
    [java]  at org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.getConnectionFactory(JDBCConfigurationImpl.java:733) 
    [java]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    [java]  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    [java]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    [java]  at java.lang.reflect.Method.invoke(Method.java:606) 
    [java]  at org.apache.openjpa.lib.conf.ConfigurationImpl.instantiateAll(ConfigurationImpl.java:295) 
    [java]  at org.apache.openjpa.conf.OpenJPAConfigurationImpl.instantiateAll(OpenJPAConfigurationImpl.java:1671) 
    [java]  at org.apache.openjpa.kernel.AbstractBrokerFactory.makeReadOnly(AbstractBrokerFactory.java:646) 
    [java]  at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:203) 
    [java]  at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:156) 
    [java]  at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:227) 
    [java]  at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:60) 
    [java]  at org.apache.openejb.assembler.classic.ReloadableEntityManagerFactory.createEntityManager(ReloadableEntityManagerFactory.java:160) 
    [java]  at org.apache.openejb.persistence.JtaEntityManagerRegistry.getEntityManager(JtaEntityManagerRegistry.java:115) 
    [java]  at org.apache.openejb.persistence.JtaEntityManager.getEntityManager(JtaEntityManager.java:80) 
    [java]  at org.apache.openejb.persistence.JtaEntityManager.persist(JtaEntityManager.java:126) 
    [java]  at rs.ac.uns.ftn.informatika.mbs2.vezbe09.primer01.server.session.InitBean.init(InitBean.java:22) 
    [java]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 

and so on .... 

Ant任務觸發數據庫生成:

<target name="prepare-database"> 
     <echo message="Inserting default user into database."/> 
     <java classname="rs.ac.uns.ftn.informatika.mbs2.vezbe09.primer01.client.InitClient" fork="true"> 
      <classpath> 
       <pathelement path="${build}" /> 
       <fileset dir="${lib}"> 
        <include name="*.jar"/> 
       </fileset> 
      </classpath> 
     </java> 
</target> 

「InitClient」 級(從這個螞蟻任務開始)有在其主要方法中的下一個代碼:

Context ctx = new InitialContext(); 
      Init init = (Init) ctx.lookup("InitBeanRemote"); 
      System.out.println("Bean found!"); 
      init.init(); 

「InitBean」類,其中實體管理r被注入:

@Stateless 
@Remote(Init.class) 
public class InitBean implements Init { 

    @PersistenceContext(unitName = "Vezbe09") 
    EntityManager em; 

    public void init() { 

     Korisnik korisnik = new Korisnik("Admin", "Admin", "admin", "admin"); 
     em.persist(korisnik); 
      //... 
     } 
} 

persistent.xml - 持久性單元定義:在tomee.xml配置文件

<persistence-unit name="Vezbe09" transaction-type="JTA"> 
    <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 
    <jta-data-source>Vezbe09DS</jta-data-source> 
    <properties> 
     <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)" /> 
     <property name="openjpa.jdbc.DBDictionary" value="mysql" /> 
     <property name="openjpa.Log" value="DefaultLevel=WARN, Tool=INFO" /> 
    </properties> 
</persistence-unit> 

數據源定義:

<Resource id="Vezbe09DS" type="DataSource"> 
    JdbcDriver   com.mysql.jdbc.Driver 
    JdbcUrl    jdbc:mysql://127.0.0.1:3306/Vezbe09 
    UserName   root 
    Password   123 
    JtaManaged   true 
    DefaultAutoCommit false 
</Resource> 

(奇怪的是,我過去曾經運行過這個應用程序,而且運行良好。我正在獲取數據庫,並正在運行應用程序。) 欣賞任何建議。

回答

2

我的錯! (仍在學習)。

上面的代碼和設置都很好。我認爲持久性提供者(openJPA)不僅創建數據庫表,還創建數據庫本身。我認爲這是因爲在數據源定義(包含db名稱)中給出了「JdbcUrl屬性」。顯然,我需要創建數據庫,並且持久性提供者正在爲現有數據庫創建表。所以,我已經(明確)使用mysql終端命令創建數據庫「create database Vezbe09;」 ,部署我的應用程序,在ant任務之上運行,觸發openJPA,並且我的數據庫中有表格。

+0

你可以標記你的aswer接受然後! – A4L

+0

@ A4L - 嗯,我嘗試了,但得到通知我只能在兩天內接受我自己的答案。 – Vladimir

相關問題