我想從註釋的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>
(奇怪的是,我過去曾經運行過這個應用程序,而且運行良好。我正在獲取數據庫,並正在運行應用程序。) 欣賞任何建議。
你可以標記你的aswer接受然後! – A4L
@ A4L - 嗯,我嘗試了,但得到通知我只能在兩天內接受我自己的答案。 – Vladimir