2015-05-26 18 views
5

Tôi đã cài đặt Hibernate trên Glassfish 4.1 nhưng tôi gặp vấn đề với sự kiên trì. Tôi có thể đọc dữ liệu, nhưng không thể ghi vào BD (các thay đổi dường như không được cam kết).Hibernate với Glassfish 4.1

persistent.xml hiện tại của tôi trông như thế này:

<?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> 

tôi kết nối hồ bơi cấu hình trên Glassfish là:

<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> 

Datasource config:

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

EJB của tôi trông như thế này :

@PersistenceContext 
private EntityManager em; 

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

Bất kỳ ý tưởng nào tôi có thể khắc phục điều đó?

Cảm ơn!

+0

Xin chào, bạn đang quản lý giao dịch của mình bằng cách nào? Điều này có vẻ như nó không có giao dịch đang hoạt động hoặc chúng không được cam kết. Bạn đã thử với JtaTransactionFactory thay vì CMTTransactionFactory chưa? Bạn có thể gửi một mẫu EJB của bạn mà bạn vẫn tồn tại bất kỳ dữ liệu nào không? –

+0

Xin chào André, tôi đã thử với JtaTransactionFactory và trong trường hợp đó ứng dụng bị treo (có vẻ như nó đang chờ giao dịch). EJB của tôi đang sử dụng giao dịch quản lý vùng chứa và mọi thứ hoạt động tốt trên Wildfly 8.1. –

+0

Bạn có thể cung cấp cấu hình jta-data-source của mình trên thủy tinh không? –

Trả lời

1

Ông có thể vui lòng thực hiện cấu hình sau:

<?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> 
+0

Câu trả lời này sẽ tốt hơn nếu bạn giải thích một chút về những gì bạn đang đề xuất và tại sao bạn nghĩ điều đó sẽ giúp ích. – Lii

+0

Xin chào Manu, tôi đang sử dụng hibernate, MSSQLServer và JTA! Đề nghị kiên trì của bạn là rất chung chung. Cảm ơn –

1

Trong trường hợp của tôi, tôi đã chạy Hibernate 5 với tomcat và ngừng làm việc khi tôi thay đổi để Glassfish 4.1

Lý do là JBoss lâu đời nhất -logging.jar tại: "YOUR_GLASSFISH_FOLDER/glassfish/modules"

Tại sao? Các hibernate 5 có sự phụ thuộc với phiên bản mới nhất của jboss-logging, và glassfish sử dụng phiên bản cũ nhất ngay cả khi bạn khai báo bên trong tệp POM của bạn phiên bản mới nhất. Thật sự tôi đang sử dụng:

org.jboss.logging jboss-logging 3.3.0.Final 

Sau đó, tôi đã tải về và thay thế .jar cũ bên trong module con đường và trở lại làm việc, tôi đã dành 2 ngày cố gắng giải quyết điều đó và tôi hy vọng nó sẽ giúp một số vấn đề trong tương lai = D

Tôi đã sử dụng liên kết này để giúp tôi: https://medium.com/@mertcal/using-hibernate-5-on-payara-cc242212a5d6#.npq2hdprz