【问题标题】:Can't get Java JPA example running?无法运行 Java JPA 示例?
【发布时间】:2014-11-25 04:21:15
【问题描述】:

(旧消息): 我正在尝试根据JPA Reference Guide 运行我的 Java JPA WAR-Project。我正在使用 Wildfly 8 和 MySQL 数据库。但是,一旦我尝试坚持使用 EntityManager,就会出现错误。我真的被困在这里了! :( 有人知道怎么回事吗??

(编辑): 好的,我目前的状态是下面这个。我无法删除@ManagedBean,因为我需要从 XHTML 页面 (RichFaces) 进行调用。因此,我将所有 JPA 内容放在一个单独的类 DbAccess 中。程序运行,但只要我按下按钮调用 Index.doContentMock(),然后链接到 DbAccess.doContentMock(),我就会收到下面发布的错误。 怎么了?

(编辑 2): 由于某种原因,在注入 DbAccess 进行更改后,EntityManager 仍然无法工作。 为什么 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)

【问题讨论】:

  • 错误很明显。您没有创建交易。
  • 我必须如何创建一个?

标签: java mysql jpa transactions wildfly


【解决方案1】:

在持久化上下文注释中添加另一个属性,如下所示: @PersistenceContext(unitName = "AbcPU", type = PersistenceContextType.EXTENDED)

那么它可能会起作用。

【讨论】:

  • 还是不行。如果我这样做,我会得到另一个错误。我将在下面发布它作为答案。有什么想法吗?
  • 删除 managedbean 注释,但保留我的答案中指定的 @PersistencContext 注释
  • 我无法删除@ManagedBean,因为如果这样做,我将无法从 index.xhtml 进行调用。我将在我的第一篇文章中使用“编辑”更新我的状态。 (抱歉,不知道 Stack 是这样做的……)
  • 好的,已将帖子编辑为当前状态。给您带来的不便深表歉意!
  • 现在 bean 没有被实例化,这就是 nullpointerexception 的原因
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多