【问题标题】:javax.ejb.EJBTransactionRolledbackException glassfish 3.1 with EJBjavax.ejb.EJBTransactionRolledbackException glassfish 3.1 与 EJB
【发布时间】:2014-07-25 11:42:02
【问题描述】:

我在 Web 应用程序中创建了 Entity、DAo 和 Façade。我的代码没有错误,但是在使用 JPA 的 find(T.class,id) 方法时出现此异常。它还说我的实体上没有 @Entity 注释。但这不是真的。如何解决这个问题。

我的实体

@Entity
@Table(name = "uyeler")
public class Uyeler implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@Column(name = "kullaniciadi")
private String kullaniciadi;

@Column(name = "sifre")
private String sifre;

@Column(name = "ad")
private String ad;

@Column(name = "soyad")
private String soyad;

@Column(name = "cinsiyet")
private String cinsiyet;

@Column(name = "ilgialanlari")
private String ilgialanlari;

@Column(name = "dogumtarihi")
private String dogumtarihi;

@Column(name = "eposta")
private String eposta;

@Column(name = "epostahaberdar")
private String epostahaberdar;

public String getKullaniciadi() {
    return kullaniciadi;
}

MyDaoImpl;

public abstract class UyelerDaoImpl<T> {

private final static String UNIT_NAME ="KutuphaneOtomasyonuEJB";

@PersistenceUnit(unitName = UNIT_NAME)    
private EntityManagerFactory emf = javax.persistence.Persistence.createEntityManagerFactory(UNIT_NAME);
private EntityManager em = emf.createEntityManager(); 

public Uyeler findMemberByUserName(String username){
    return  em.find(Uyeler.class, username);
}

}

persistence.xml

<persistence-unit name="KutuphaneOtomasyonuEJB"
    transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <non-jta-data-source>jdbc/MySQLConnectionPool</non-jta-data-source>
    <class>com.mesutemre.businesModel.Kitaplar</class>
    <class>com.mesutemre.businesModel.Uyeler</class>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
        <property name="eclipselink.logging.level" value="FINEST" />
        <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3307/kutuphane" />
        <property name="javax.persistence.jdbc.user" value="root" />
        <property name="javax.persistence.jdbc.password" value="root" />
        <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
    </properties>
</persistence-unit>

堆栈跟踪;

WARNING: EJB5184:A system exception occurred during an invocation on EJB UyelerDAO, method: public com.mesutemre.businesModel.Uyeler com.mesutemre.businesDAOs.UyelerDAO.findMemberByUserName(java.lang.String)

警告:javax.ejb.TransactionRolledbackLocalException:在 com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java) 的 com.sun.ejb.containers.BaseContainer.checkExceptionClientTx(BaseContainer.java:5071) 处的 bean 抛出异常:4906) 在 com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2045) 在 com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1994) 在 com.sun.ejb.containers。 EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:222) 在 严重:原因:javax.ejb.TransactionRolledbackLocalException:从 bean 抛出的异常 严重:在 com.sun.ejb.containers.BaseContainer.checkExceptionClientTx(BaseContainer.java:5071) 严重:在 com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4906) 严重:在 com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2045) 严重:... 71 更多 严重:原因:java.lang.IllegalArgumentException:未知实体 bean 类:com.mesutemre.businesModel.Uyeler 类,请验证该类是否已使用 @Entity 注释进行标记。 严重:在 org.eclipse.persistence.internal.jpa.EntityManagerImpl.find(EntityManagerImpl.java:648) 严重:

【问题讨论】:

  • 请将实体和 DAO 类以及您的 persistence.xml 添加到问题中。
  • 我已经添加了我的实体和 dao impl。
  • 代码看起来没问题。您还可以添加异常堆栈跟踪吗? PS:你不应该使用RESOURCE_LOCAL,因为应用服务器提供了一个JTA-datasource。
  • 我已经添加了堆栈跟踪

标签: jpa glassfish ejb dao


【解决方案1】:

看起来这是 GlassFish 的重新部署/缓存问题。如果您使用事务类型RESOURCE_LOCAL 并手动创建EntityManager 并重新部署,则可能是旧的EntityManager 或相应的工厂仍被GlassFish 缓存,因此只知道一些旧值。

最快的解决方案应该是重新启动 GlassFish 并重新部署应用程序。

另一个解决方案是在取消/重新部署时显式关闭 EntityManagerFactory。

无论如何,首选的解决方案是使用事务类型JTA,以便EntityManager 由容器管理。这更容易使用并且不易出错。这是一个简短的例子:

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class FileDAO {

    @PersistenceContext
    private EntityManager em;

    public void store(File file) {
        em.persist(file);
    }
}

另请参阅:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    相关资源
    最近更新 更多