【问题标题】:Hibernate with Glassfish 4.1使用 Glassfish 4.1 休眠
【发布时间】:2015-08-07 11:31:42
【问题描述】:

我已经在 Glassfish 4.1 上设置了 Hibernate,但我遇到了持久性问题。 我能够读取数据,但无法写入 BD(似乎未提交更改)。

我当前的 persistent.xml 如下所示:

 <?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://java.sun.com/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="myPU" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>jdbc/myDataSource</jta-data-source>
    <properties>
      <property name="transaction.manager_lookup_class" value="org.hibernate.transaction.SunONETransactionManagerLookup"/>
      <property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.CMTTransactionFactory"/>
      <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform"/>
      <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServer2008Dialect"/>
    </properties>
  </persistence-unit>
</persistence>

我在 Glassfish 上的连接池配置是:

<jdbc-connection-pool datasource-classname="com.microsoft.sqlserver.jdbc.SQLServerDataSource" steady-pool-size="2" name="myPool" res-type="javax.sql.DataSource">
  <property name="TrustServerCertificate" value="false"></property>
  <property name="User" value="sa"></property>
  <property name="LastUpdateCount" value="true"></property>
  <property name="ResponseBuffering" value="adaptive"></property>
  <property name="URL" value="jdbc:sqlserver://server\bd"></property>
  <property name="XopenStates" value="false"></property>
  <property name="PacketSize" value="8000"></property>
  <property name="Password" value="mypass"></property>
  <property name="ApplicationName" value="Microsoft JDBC Driver for SQL Server"></property>
  <property name="DatabaseName" value="MyDB"></property>
  <property name="Encrypt" value="false"></property>
  <property name="LockTimeout" value="-1"></property>
  <property name="SendStringParametersAsUnicode" value="true"></property>
  <property name="MultiSubnetFailover" value="false"></property>
  <property name="ApplicationIntent" value="readwrite"></property>
  <property name="LoginTimeout" value="15"></property>
  <property name="WorkstationID" value="My-MacBook-Pro.local"></property>
  <property name="ServerName" value="xpto"></property>
  <property name="PortNumber" value="1433"></property>
  <property name="SelectMethod" value="direct"></property>
  <property name="SendTimeAsDatetime" value="true"></property>
</jdbc-connection-pool>

数据源配置:

<jdbc-resource pool-name="myPool" jndi-name="jdbc/myDataSource"></jdbc-resource>

我的 EJB 如下所示:

@PersistenceContext
private EntityManager em;

public void updateUser(User u) {
        em.merge(u);
}

知道如何解决这个问题吗?

谢谢!

【问题讨论】:

  • 您好,您是如何管理交易的?看起来它没有活动事务,或者它们没有被提交。您是否尝试过使用 JtaTransactionFactory 而不是 CMTTransactionFactory?您能否发布一个您的 EJB 示例,您可以在其中保留任何数据?
  • 嗨 André,我尝试使用 JtaTransactionFactory,在这种情况下应用程序挂起(它似乎正在等待交易)。我的 EJB 正在使用容器管理器事务,并且在 Wildfly 8.1 上一切正常。
  • 你能在 glassfish 上提供你的 jta-data-source 配置吗?
  • 当然,安德烈,这是问题所在。谢谢!
  • 你能补充一下你是如何使用你的 EJB 来注入事务的吗?到目前为止,我没有发现任何问题:/

标签: java hibernate glassfish hibernate-mapping jpa-2.1


【解决方案1】:

在我的情况下,我使用 tomcat 运行 Hibernate 5,当我更改为 glassfish 4.1 时停止工作

原因是最旧的 jboss-logging.jar 位于:“YOUR_GLASSFISH_FOLDER/glassfish/modules”

为什么? hibernate 5 依赖于最新版本的 jboss-logging,即使您在 POM 文件中声明最新版本,glassfish 也使用最旧版本。实际上我正在使用:

org.jboss.logging jboss-logging 3.3.0.Final

然后我下载并替换了模块路径中的旧 .jar 并重新开始工作,我花了 2 天时间试图解决这个问题,我希望它对未来的一些问题有所帮助 =D

我使用此链接来帮助我:https://medium.com/@mertcal/using-hibernate-5-on-payara-cc242212a5d6#.npq2hdprz

【讨论】:

    【解决方案2】:

    你能不能试试下面的配置:

        <?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="YOUR_PERSISTANCE_NAME" transaction-type="RESOURCE_LOCAL">
            <provider>YOUR_PROVIDER</provider>
    
            <!-- ENTITIES -->
            <class>com.company.project....EntityA</class>
            <class>com.company.project....EntityB</class>
            <class>com.company.project....EntityC</class>
    
            <properties>
                <property name="javax.persistence.jdbc.url" value="YOUR_URL_TO_DB" />
                <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
                <property name="javax.persistence.jdbc.user" value="USER" />
                <property name="javax.persistence.jdbc.password" value="PASS" />
                <property name="eclipselink.logging.level" value="INFO" />
                <property name="eclipselink.target-database" value="PostgreSQL" />
            </properties>
        </persistence-unit>
    

    【讨论】:

    • 如果您稍微解释一下您的建议以及您认为这会有所帮助的原因,这个答案会更好。
    • 嗨 Manu,我正在使用 hibernate、MSSQLServer 和 JTA!您的持久性建议非常笼统。谢谢
    猜你喜欢
    • 2014-12-26
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多