2014-09-30 62 views
0

(旧消息): 我试图让我的Java JPA WAR-Project运行根据JPA Reference Guide。我正在使用Wildfly 8和一个MySQL数据库。但是,只要我试图坚持使用EntityManager,就会收到错误。我真的被困在这里! :(有人知道什么是错的吗?无法获取Java JPA示例运行?

(编辑): 好的,我现在的状态是下面的这个:我不能删除@ManagedBean,因为我需要从XHTML页面(RichFaces)进行调用。 ,我把所有的JPA东西放在一个单独的DbAccess类中,程序运行,但只要我按下按钮来调用Index.doContentMock(),然后链接到DbAccess.doContentMock(),我得到错误。贴在下面 哪些错误

(编辑2):。 出于某种原因了EntityManager仍然不与注射DBACCESS的changments工作后 为什么不EntityManager的工作

我XHTML主叫类:

import com.glasses.abc.business.Content; 
import java.util.List; 
import javax.ejb.Stateful; 
import javax.faces.bean.ManagedBean; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 

@ManagedBean 
public class Index { 

    @Inject 
    DbAccess dba; 

    public void doContentMock() { 
     System.out.println("XXXXX AUFRUFEN VON Index.doContentMock()"); 
     dba.doContentMock(); 
    } 
} 

我的内容实体类:

@Entity 
public class Content implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    private String contentCode; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getContentCode() { 
     return this.contentCode; 
    } 

    public void setContentCode(String contentCode) { 
     this.contentCode = contentCode; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (id != null ? id.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     // TODO: Warning - this method won't work in the case the id fields are not set 
     if (!(object instanceof Content)) { 
      return false; 
     } 
     Content other = (Content) object; 
     if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() { 
     return "com.glasses.abc.business.Content[ id=" + id + ", contentCode='" + contentCode + "' ]"; 
    } 

} 

我的新DBACCESS类:

@Stateful 
public class DbAccess { 
    @PersistenceContext(unitName = "AbcPU", type = PersistenceContextType.EXTENDED) // default type is PersistenceContextType.TRANSACTION 
    EntityManager em; 

    public void doContentMock() { 
     System.out.println("XXXXX 0"); 
     System.out.println(em); 
     System.out.println("XXXXX 1"); 
     Content content = new Content(); 
     System.out.println("XXXXX 2"); 
     content.setId((long) 5); 
     System.out.println("XXXXX 3"); 
     content.setContentCode("Hier ist ein bestimmter Code, der in die Datenbank soll!"); 
     System.out.println("XXXXX 4"); 
     System.out.println(content); 
     try { 
     em.persist(content); 
     } catch (Exception ex) { 
      System.out.println("XXXXX Could not persist:"); 
      System.out.println(ex.getMessage()); 
     } 
     System.out.println("XXXXX 5"); 
    } 
} 

我的persistence.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://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 
    <persistence-unit name="AbcPU" transaction-type="JTA"> 
     <exclude-unlisted-classes>false</exclude-unlisted-classes> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <properties> 
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/abc?zeroDateTimeBehavior=convertToNull"/> 
      <property name="javax.persistence.jdbc.password" value="pwd"/> 
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
      <property name="javax.persistence.jdbc.user" value="root"/> 
      <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

我的错误:

22:58:17,695 INFO [stdout] (default task-10) XXXXX 0 
22:58:17,695 INFO [stdout] (default task-10) ExtendedEntityManager [abc.war#AbcPU] 
22:58:17,695 INFO [stdout] (default task-10) XXXXX 1 
22:58:17,696 INFO [stdout] (default task-10) XXXXX 2 
22:58:17,696 INFO [stdout] (default task-10) XXXXX 3 
22:58:17,696 INFO [stdout] (default task-10) XXXXX 4 
22:58:17,696 INFO [stdout] (default task-10) com.glasses.abc.business.Content[ id=5, contentCode='Hier ist ein bestimmter Code, der in die Datenbank soll!' ] 
22:58:17,697 INFO [stdout] (default task-10) XXXXX Could not persist: 
22:58:17,697 INFO [stdout] (default task-10) org.hibernate.PersistentObjectException: detached entity passed to persist: com.glasses.abc.business.Content 
22:58:17,698 INFO [stdout] (default task-10) XXXXX 5 
22:58:17,702 INFO [stdout] (default task-10) XXXXX AUFRUFEN VON getContent(0) 
+0

错误很明显。您没有创建交易。 – proulxs 2014-09-30 13:56:20

+0

我将如何创建一个? – Socrates 2014-09-30 14:50:24

回答

0

在持久性上下文注解添加另一个属性是这样的: @PersistenceContext(的unitName = “AbcPU”,类型= PersistenceContextType.EXTENDED)

然后它可能工作。

+0

仍然不起作用。如果我这样做,我会得到另一个错误。我会在下面将它作为答案发布。任何想法? – Socrates 2014-09-30 14:52:39

+0

最新错误? – pd30 2014-09-30 14:57:57

+0

删除managedbean注释,但保留我的答案 – pd30 2014-09-30 15:14:06