不使用 Java EE 8 生成表

Posted

技术标签:

【中文标题】不使用 Java EE 8 生成表【英文标题】:Not generating tables with Java EE 8 【发布时间】:2019-05-14 12:24:33 【问题描述】:

我正在尝试将我的应用程序(war 文件)从 WildFly 迁移到 Open Liberty。

WildFly 在启动时会读取persistence.xml,并使用persistence.xml 中定义的属性<property name="hibernate.hbm2ddl.auto" value="create"/> 自动创建表。

persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             version="2.1"
             xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="my-pu">
        <jta-data-source>jdbc/myDB</jta-data-source>
        <properties>
            <property name="hibernate.hbm2ddl.auto" value="create"/>
            <property name="hibernate.dialect"
                      value="org.hibernate.dialect.mysql5Dialect"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.hbm2ddl.import_files"
                      value="data.sql"/>

            <property name="hibernate.hbm2ddl.charset_name" value="UTF-8"/>
        </properties>
    </persistence-unit>
</persistence>

另一方面,使用 Open Liberty,什么都不会发生。如果&lt;jta-data-source&gt;jdbc/myDB&lt;/jta-data-source&gt;server.xml 中定义不正确,我确实会收到错误,因此persistence.xml 以某种方式被读取。差不多就是这样。即使我打开hibernate.show_sql,也没有任何输出会有所帮助。

这是一次启动的日志:

product = Open Liberty 19.0.0.4 (wlp-1.0.27.cl190420190419-0642)
wlp.install.dir = C:/openliberty-19.0.0.4/wlp/
java.home = C:\Program Files\Java\jdk1.8.0_201\jre
java.version = 1.8.0_201
java.runtime = Java(TM) SE Runtime Environment (1.8.0_201-b09)
os = Windows 10 (10.0; amd64) (de_DE)
process = 11584@DESKTOP-HIB1MRJ
********************************************************************************
[14.05.19 14:05:48:173 MESZ] 00000001 com.ibm.ws.kernel.launch.internal.FrameworkManager           A CWWKE0001I: Der Server defaultServer wurde gestartet.
[14.05.19 14:05:49:354 MESZ] 00000001 com.ibm.ws.kernel.launch.internal.FrameworkManager           I CWWKE0002I: Der Kernel wurde nach  1,379 Sekunden gestartet.
[14.05.19 14:05:49:423 MESZ] 0000001f com.ibm.ws.kernel.feature.internal.FeatureManager            I CWWKF0007I: Die Featureaktualisierung wurde gestartet.
[14.05.19 14:05:49:608 MESZ] 00000017 com.ibm.ws.security.ready.internal.SecurityReadyServiceImpl  I CWWKS0007I: Der Sicherheitsservice wird gestartet...
[14.05.19 14:05:49:955 MESZ] 00000017 com.ibm.ws.app.manager.internal.monitor.DropinMonitor        A CWWKZ0058I: dropins auf Anwendungen überwachen.
[14.05.19 14:05:50:383 MESZ] 00000017 ibm.ws.security.authentication.internal.jaas.JAASServiceImpl I CWWKS1123I: Das Verbundauthentifizierungs-Plug-in mit dem Klassennamen NullCollectiveAuthenticationPlugin wurde aktiviert. 
[14.05.19 14:05:50:393 MESZ] 00000025 com.ibm.ws.security.token.ltpa.internal.LTPAKeyCreateTask    I CWWKS4105I: Die LTPA-Konfiguration ist nach 0,038 Sekunden bereit.
[14.05.19 14:05:50:434 MESZ] 00000019 com.ibm.ws.ssl.config.WSKeyStore                             E CWPKI0033E: Der Keystore in C:/openliberty-19.0.0.4/wlp/usr/servers/defaultServer/resources/security/key.p12 konnte wegen des folgenden Fehlers nicht geladen werden: keystore password was incorrect
[14.05.19 14:05:50:437 MESZ] 00000019 com.ibm.ws.ssl.config.WSKeyStore                             W CWPKI0809W: Beim Laden des Keystores defaultKeyStore ist ein Fehler aufgetreten. Wenn eine SSL-Konfiguration den defaultKeyStore-Keystore referenziert, schlägt die Initialisierung der SSL-Konfiguration fehl. 
[14.05.19 14:05:50:642 MESZ] 00000028 com.ibm.ws.tcpchannel.internal.TCPChannel                    I CWWKO0219I: Der TCP-Kanal defaultHttpEndpoint wurde gestartet und ist jetzt für Anforderungen auf dem Host 127.0.0.1  (IPv4: 127.0.0.1) an Port 9080 empfangsbereit.
[14.05.19 14:05:50:719 MESZ] 00000017 com.ibm.ws.security.jaspi.AuthConfigFactoryWrapper           I CWWKS1655I: Die JASPIC-Standard-AuthConfigFactory-Klasse com.ibm.ws.security.jaspi.ProviderRegistry wird verwendet, weil die Java-Sicherheitseigenschaft authconfigprovider.factory nicht gesetzt ist. 
[14.05.19 14:05:51:142 MESZ] 00000017 com.ibm.ws.tcpchannel.internal.TCPChannel                    I CWWKO0219I: Der TCP-Kanal wasJmsEndpoint456 wurde gestartet und ist jetzt für Anforderungen auf dem Host 127.0.0.1  (IPv4: 127.0.0.1) an Port 7276 empfangsbereit.
[14.05.19 14:05:51:885 MESZ] 00000017 com.ibm.ws.sib.utils.ras.SibMessage                          I  CWSID0108I: Der JMS-Server wurde gestartet. 
[14.05.19 14:05:52:328 MESZ] 00000017 org.apache.cxf.bus.osgi.CXFActivator                         I Adding the extensions from bundle com.ibm.ws.org.apache.cxf.cxf.core.3.2 (196) [org.apache.cxf.phase.PhaseManager, org.apache.cxf.workqueue.WorkQueueManager, org.apache.cxf.buslifecycle.BusLifeCycleManager, org.apache.cxf.endpoint.ServerRegistry, org.apache.cxf.endpoint.EndpointResolverRegistry, org.apache.cxf.headers.HeaderManager, org.apache.cxf.service.factory.FactoryBeanListenerManager, org.apache.cxf.endpoint.ServerLifeCycleManager, org.apache.cxf.endpoint.ClientLifeCycleManager, org.apache.cxf.resource.ResourceManager, org.apache.cxf.catalog.OASISCatalogManager, org.apache.cxf.transport.http.HTTPTransportFactory, org.apache.cxf.transport.http.HTTPWSDLExtensionLoader, org.apache.cxf.transport.http.policy.HTTPClientAssertionBuilder, org.apache.cxf.transport.http.policy.HTTPServerAssertionBuilder, org.apache.cxf.transport.http.policy.NoOpPolicyInterceptorProvider, org.apache.cxf.transport.http.HTTPConduitFactory, org.apache.cxf.transport.ConduitInitiator]
[14.05.19 14:05:52:338 MESZ] 00000017 org.apache.cxf.bus.osgi.CXFActivator                         I Adding the extensions from bundle com.ibm.ws.org.apache.cxf-rt-ws-addr.2.6.2 (260) [org.apache.cxf.ws.addressing.policy.AddressingAssertionBuilder, org.apache.cxf.ws.addressing.policy.UsingAddressingAssertionBuilder, org.apache.cxf.ws.addressing.policy.AddressingPolicyInterceptorProvider, org.apache.cxf.ws.addressing.impl.AddressingWSDLExtensionLoader, org.apache.cxf.ws.addressing.WSAddressingFeature$WSAddressingFeatureApplier, org.apache.cxf.ws.addressing.MAPAggregator$MAPAggregatorLoader]
[14.05.19 14:05:52:339 MESZ] 00000017 org.apache.cxf.bus.osgi.CXFActivator                         I Adding the extensions from bundle com.ibm.ws.org.apache.cxf-rt-frontend-jaxws.2.6.2 (262) [org.apache.cxf.jaxws.context.WebServiceContextResourceResolver]
[14.05.19 14:05:52:340 MESZ] 00000017 org.apache.cxf.bus.osgi.CXFActivator                         I Adding the extensions from bundle com.ibm.ws.org.apache.cxf-rt-management.2.6.2 (269) [org.apache.cxf.management.InstrumentationManager]
[14.05.19 14:05:52:340 MESZ] 00000017 org.apache.cxf.bus.osgi.CXFActivator                         I Adding the extensions from bundle com.ibm.ws.org.apache.cxf-rt-bindings-xml.2.6.2 (271) [org.apache.cxf.binding.xml.XMLBindingFactory, org.apache.cxf.binding.xml.wsdl11.XMLWSDLExtensionLoader]
[14.05.19 14:05:52:341 MESZ] 00000017 org.apache.cxf.bus.osgi.CXFActivator                         I Adding the extensions from bundle com.ibm.ws.org.apache.cxf-rt-transports-http.2.6.2 (272) [org.apache.cxf.transport.http.HTTPTransportFactory, org.apache.cxf.transport.http.HTTPWSDLExtensionLoader, org.apache.cxf.transport.http.policy.HTTPClientAssertionBuilder, org.apache.cxf.transport.http.policy.HTTPServerAssertionBuilder, org.apache.cxf.transport.http.policy.NoOpPolicyInterceptorProvider]
[14.05.19 14:05:52:341 MESZ] 00000017 org.apache.cxf.bus.osgi.CXFActivator                         I Adding the extensions from bundle com.ibm.ws.org.apache.cxf-rt-bindings-soap.2.6.2 (273) [org.apache.cxf.binding.soap.SoapBindingFactory, org.apache.cxf.binding.soap.SoapTransportFactory]
[14.05.19 14:05:52:342 MESZ] 00000017 org.apache.cxf.bus.osgi.CXFActivator                         I Adding the extensions from bundle com.ibm.ws.org.apache.cxf-rt-ws-policy.2.6.2 (276) [org.apache.cxf.ws.policy.PolicyEngine, org.apache.cxf.policy.PolicyDataEngine, org.apache.cxf.ws.policy.AssertionBuilderRegistry, org.apache.cxf.ws.policy.PolicyInterceptorProviderRegistry, org.apache.cxf.ws.policy.PolicyBuilder, org.apache.cxf.ws.policy.PolicyAnnotationListener, org.apache.cxf.ws.policy.attachment.ServiceModelPolicyProvider, org.apache.cxf.ws.policy.attachment.external.DomainExpressionBuilderRegistry, org.apache.cxf.ws.policy.attachment.external.EndpointReferenceDomainExpressionBuilder, org.apache.cxf.ws.policy.attachment.wsdl11.Wsdl11AttachmentPolicyProvider, org.apache.cxf.ws.policy.mtom.MTOMAssertionBuilder, org.apache.cxf.ws.policy.mtom.MTOMPolicyInterceptorProvider]
[14.05.19 14:05:53:040 MESZ] 00000017 com.ibm.ws.cache.ServerCache                                 I DYNA1001I: Die Instanz von WebSphere Dynamic Cache mit dem Namen baseCache wurde ordnungsgemäß initialisiert.
[14.05.19 14:05:53:047 MESZ] 00000017 com.ibm.ws.cache.ServerCache                                 I DYNA1071I: Der Cacheprovider default wird verwendet.
[14.05.19 14:05:53:050 MESZ] 00000017 com.ibm.ws.cache.CacheServiceImpl                            I DYNA1056I: Dynamic Cache (Objektcache) wurde erfolgreich initialisiert.
[14.05.19 14:05:53:936 MESZ] 00000027 com.ibm.ws.config.xml.internal.ConfigRefresher               A CWWKG0016I: Die Aktualisierung der Serverkonfiguration wird gestartet.
[14.05.19 14:05:53:958 MESZ] 00000027 com.ibm.ws.config.xml.internal.ConfigRefresher               A CWWKG0018I: Die Serverkonfiguration wurde nicht aktualisiert. Es wurden keine funktionalen Änderungen erkannt.
[14.05.19 14:05:54:083 MESZ] 00000043 com.ibm.ws.app.manager.AppMessageHelper                      I CWWKZ0018I: Die Anwendung backend wird gestartet.
[14.05.19 14:05:54:767 MESZ] 0000003e com.ibm.ws.session.WASSessionCore                            I SESN8501I: Der Sitzungsmanager konnte keine persistente Speicherposition finden. HttpSession-Objekte werden im lokalen Anwendungsserverspeicher gespeichert.
[14.05.19 14:05:54:785 MESZ] 0000003e com.ibm.ws.webcontainer.osgi.webapp.WebGroup                 I SRVE0169I: Das Webmodul wird geladen: OpenAPIUI.
[14.05.19 14:05:54:785 MESZ] 00000031 com.ibm.ws.webcontainer.osgi.webapp.WebGroup                 I SRVE0169I: Das Webmodul wird geladen: MicroProfileOpenAPI.
[14.05.19 14:05:54:788 MESZ] 0000003e com.ibm.ws.webcontainer                                      I SRVE0250I: Das Webmodul OpenAPIUI wurde an default_host gebunden.
[14.05.19 14:05:54:789 MESZ] 00000031 com.ibm.ws.webcontainer                                      I SRVE0250I: Das Webmodul MicroProfileOpenAPI wurde an default_host gebunden.
[14.05.19 14:05:54:790 MESZ] 0000003e com.ibm.ws.http.internal.VirtualHostImpl                     A CWWKT0016I: Webanwendung verfügbar: (default_host): http://localhost:9080/openapi/ui/
[14.05.19 14:05:54:792 MESZ] 00000031 com.ibm.ws.http.internal.VirtualHostImpl                     A CWWKT0016I: Webanwendung verfügbar: (default_host): http://localhost:9080/openapi/
[14.05.19 14:05:54:861 MESZ] 00000022 com.ibm.ws.session.WASSessionCore                            I SESN0176I: Es wird ein neuer Sitzungskontext für den Anwendungsschlüssel default_host/openapi erstellt.
[14.05.19 14:05:54:862 MESZ] 00000047 com.ibm.ws.session.WASSessionCore                            I SESN0176I: Es wird ein neuer Sitzungskontext für den Anwendungsschlüssel default_host/openapi/ui erstellt.
[14.05.19 14:05:54:879 MESZ] 00000022 com.ibm.ws.util                                              I SESN0172I: Der Sitzungsmanager verwendet die SecureRandom-Java-Standardimplementierung für die Generierung von Sitzungs-IDs.
[14.05.19 14:05:54:890 MESZ] 00000047 com.ibm.ws.util                                              I SESN0172I: Der Sitzungsmanager verwendet die SecureRandom-Java-Standardimplementierung für die Generierung von Sitzungs-IDs.
[14.05.19 14:05:54:991 MESZ] 00000022 org.hibernate.validator.internal.util.Version                I HV000001: Hibernate Validator 6.0.13.Final
[14.05.19 14:05:55:045 MESZ] 00000024 com.ibm.ws.webcontainer.osgi.mbeans.PluginGenerator          I SRVE9103I: Es wurde automatisch eine Konfigurationsdatei für ein Web-Server-Plug-in für diesen Server unter C:\openliberty-19.0.0.4\wlp\usr\servers\defaultServer\logs\state\plugin-cfg.xml generiert.
[14.05.19 14:05:55:299 MESZ] 00000047 com.ibm.ws.cache.CacheServiceImpl                            I DYNA1056I: Dynamic Cache (Objektcache) wurde erfolgreich initialisiert.
[14.05.19 14:05:55:321 MESZ] 00000047 org.apache.myfaces.ee.MyFacesContainerInitializer            I Using org.apache.myfaces.ee.MyFacesContainerInitializer
[14.05.19 14:05:55:321 MESZ] 00000022 org.apache.myfaces.ee.MyFacesContainerInitializer            I Using org.apache.myfaces.ee.MyFacesContainerInitializer
[14.05.19 14:05:55:464 MESZ] 00000022 com.ibm.ws.webcontainer.servlet                              I SRVE0242I: [com.ibm.ws.microprofile.openapi] [/openapi] [OpenAPIServlet]: Initialisierung erfolgreich.

是的,它是德语的。我想,有了基本的翻译,应该没问题。

我的server.xml 如下所示

<?xml version="1.0" encoding="UTF-8"?>
<server description="new server">
  <!-- Enable features -->
  <featureManager>
    <feature>localConnector-1.0</feature>
    <feature>javaee-8.0</feature>
    <feature>mpOpenAPI-1.0</feature>
    <feature>jndi-1.0</feature>
  </featureManager>
  <library id="MySQLLib">
    <fileset dir="C:/openliberty-19.0.0.4/wlp/lib" includes="mysql-connector-java-8.0.15.jar" />
  </library>
  <dataSource id="myDS" jndiName="jdbc/myDB" type="javax.sql.DataSource">
    <jdbcDriver libraryRef="MySQLLib" javax.sql.DataSource="com.mysql.cj.jdbc.MysqlDataSource" />
    <properties user="root" password="" databaseName="myDB" serverName="localhost" portNumber="3306" />
  </dataSource>
  <!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" -->
  <httpEndpoint id="defaultHttpEndpoint" httpPort="9080" httpsPort="9443" />
  <!-- Automatically expand WAR files and EAR files -->
  <applicationManager autoExpand="true" />
  <applicationMonitor updateTrigger="mbean" />
  <keyStore id="defaultKeyStore" password="mysecretpassword" />
  <application id="backend" location="C:\backend\target\backend.war" name="backend" type="war" context-root="backend" />
</server>

与数据库的连接工作正常,因为如果我尝试检索我的表的(不存在的)数据时会出错:

Caused by: java.sql.SQLSyntaxErrorException: Table 'myDB.mytable' doesn't exist
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:970)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:1020)
at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.executeQuery(WSJdbcPreparedStatement.java:476)
... 30 more

如何在本地 Open Liberty 服务器启动时生成表?

【问题讨论】:

【参考方案1】:

这是因为 EclipseLink 而不是 Hibernate,是 Liberty 中的默认 JPA 持久性提供程序。 EclipseLink 忽略了特定于 Hibernate 的属性。如果要使用 EclipseLink,则需要将 Hibernate 特定属性替换为 standard ones 或 EclipseLink-specific ones。

或者,可以切换默认持久性提供程序或在持久性单元中手动指定, &lt;provider&gt;org.hibernate.jpa.HibernatePersistenceProvider&lt;/provider&gt;

【讨论】:

感谢您的回答。我真的很想知道,因为在 WildFly 中它运行得非常好,我确信我的配置是正确的。我用标准属性替换了休眠特定属性,例如:&lt;property name="javax.persistence.schema-generation.database.action" value="create" /&gt;

以上是关于不使用 Java EE 8 生成表的主要内容,如果未能解决你的问题,请参考以下文章

Java EE 8 - MVC 1.0 发布日期

如何使用 java-ee8、microProfile 4.0、Openliberty 21 和 Docker 设置特定于阶段的微配置文件配置

如何在 Resin 4.0.42 中类加载 Java EE 7 而不使用默认加载的 Default Javaee-16.jar 类

java Java EE 8 - JsonbBuilder

终极Java版本表(J2EE、Java EE、Servlet、JSP、JSTL)

Java EE之Hibernate的HibernateSessionFactory