2012-02-02 70 views
0

這是一個類似的帖子,我之前見過關於這個異常的帖子,但我完全失去了。我還沒有使用JPA將實體持久化到數據庫,儘管我使用它從表中讀取沒有任何問題。我的設置是使用Glassfish 3.1.1的Netbeans 7.1,EclipseLink是我的持久性提供者。我有一個非常簡單的場景,我只是想測試在數據庫中寫入人員姓名和年齡並使用id自動遞增。它是一個MySql數據庫,包含字段:Id,FirstName和Age。我的繼承人代碼:對象:entity.ENTITY [id = null]不是已知的實體類型

網站的servlet採取姓名和年齡從HTML表單:

@Override 
protected void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 

    String userPath = request.getServletPath(); 

    if(userPath.equals("/addUser")){ 

     //get request parameters from form 
     String name = request.getParameter("name"); 
     String age = request.getParameter("age"); 

     //set request attributes to be used by forwarded page 
     request.setAttribute("name", name); 
     request.setAttribute("age", age); 

     //create manager class to add person to database 
     Manager manager = new Manager(); 
     manager.addPerson(name, age); 

     userPath = "/result"; 
    } 

    // use RequestDispatcher to forward request internally 
    String url = "/WEB-INF/view" + userPath + ".jsp"; 

    try { 
     request.getRequestDispatcher(url).forward(request, response); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

管理類,它的名字和年齡,創建一個人對象,並堅持它。

public class Manager { 

private static final String PERSISTENCE_UNIT_NAME = "FormPU"; 
private static EntityManagerFactory factory; 

public Manager() { 
} 

public void addPerson(String name, String age) { 

    factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME); 
    EntityManager em = factory.createEntityManager(); 

    Persons persons = new Persons(); 
    persons.setName(name); 
    persons.setAge(age); 

    em.getTransaction().begin(); 
    em.persist(persons); 
    em.getTransaction().commit(); 
    em.close(); 
} 
} 

人實體類:

/** 
    * 
    * @author esmiala 
    */ 
    @Entity 
    @Table(name = "persons") 
    @XmlRootElement 
    @NamedQueries({ 
     @NamedQuery(name = "Persons.findAll", query = "SELECT p FROM Persons p"), 
     @NamedQuery(name = "Persons.findById", query = "SELECT p FROM Persons p WHERE 
     p.id = :id"), 
     @NamedQuery(name = "Persons.findByFirstName", query = "SELECT p FROM Persons p 
     WHERE p.firstName = :firstName"), 
     @NamedQuery(name = "Persons.findByAge", query = "SELECT p FROM Persons p WHERE 
     p.age = :age")}) 
public class Persons implements Serializable { 
private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Basic(optional = false) 
@NotNull 
@Column(name = "Id") 
private Integer id; 
@Basic(optional = false) 
@NotNull 
@Size(min = 1, max = 255) 
@Column(name = "FirstName") 
private String firstName; 
@Basic(optional = false) 
@NotNull 
@Size(min = 1, max = 255) 
@Column(name = "Age") 
private String age; 

public Persons() { 
} 

public Persons(Integer id) { 
    this.id = id; 
} 

public Persons(Integer id, String firstName, String age) { 
    this.id = id; 
    this.firstName = firstName; 
    this.age = age; 
} 

public Integer getId() { 
    return id; 
} 

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

public String getFirstName() { 
    return firstName; 
} 

public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 

public String getAge() { 
    return age; 
} 

public void setAge(String age) { 
    this.age = age; 
} 

@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 Persons)) { 
     return false; 
    } 
    Persons other = (Persons) 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 "entity.Persons[ id=" + id + " ]"; 
} 

}

的persistence.xml

<?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="FormPU" transaction-type="JTA"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <jta-data-source>jdbc/form</jta-data-source> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties/> 
    </persistence-unit> 
    </persistence> 

注:我也試圖排除,非流通類的標籤設置爲true,列表班級分開,但也沒有工作。

例外:

WARNING: StandardWrapperValve[Controller]: PWC1406: Servlet.service() for servlet 
    Controller threw exception 
    java.lang.IllegalArgumentException: Object: entity.persons[ id=null ] is not a 
    known entity type. 
atorg.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNewObject 
    ForPersist(UnitOfWorkImpl.java:4141) 
atorg.eclipse.persistence.internal.jpa.EntityManagerImpl. 
    persist(EntityManagerImpl.java:368) 
at manager.Manager.addPerson(Manager.java:36) 
at controller.Controller.doPost(Controller.java:70) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) 

...等等。任何幫助將不勝感激!

回答

1

<exclude-unlisted-classes>不能像你期望的那樣工作 - persistence.xml中這個元素的存在會禁止自動發現@Entity類,無論它在哪裏。

此外,@Entity(name="persons")可能不是你想要的,使用@Entity @Table (name="persons")來代替。

+0

我刪除了實體類和持久性xml文件,並使用Netbeans Entity Classes from Database嚮導生成了新文件。它產生以下但仍然不起作用。生病編輯在新的實體類... – 2012-02-02 11:54:10

1

所以你說你可以閱讀的類很好,但得到一個錯誤,堅持一個新的實例?

您可以更新您閱讀的對象嗎?

看來你有某種類加載器的問題。不知怎的,你有兩次在你的類路徑上的類,或者有兩個不同的類加載器。您傳遞的對象持續來自不同於JPA使用的類加載器。您可以檢查類讀取器的類加載器以及持久化對象的類加載器,以瞭解它們的不同之處。

您是否重新部署了應用程序或熱部署?如果您正確關閉/重新啓動服務器,它會起作用嗎?確保在重新部署之前關閉舊的EntityManagerFactory。

+0

嗨,是的,我已經重新部署,重新啓動服務器等,但沒有任何作品。 「看起來你有某種類加載器的問題,不知怎的,你在你的類路徑上有兩次類,或者有兩個不同的類加載器,你傳遞的對象持久化來自一個不同於JPA使用的類加載器。您可以檢查讀取內容的類加載器,以及持久化對象的類加載器,以瞭解它們的不同之處。「你可以進一步瞭解一下,我不知道這意味着什麼。它根本沒有拿起實體。 – 2012-02-02 14:07:48

0

關於你的具體問題,試着看看這個link有幫助。

無論如何,你實例化EntityManager的方式不是線程安全的。你可以看到here爲什麼。或者,更好的,你可以使用NetBeans的嚮導從實體類創建JPA控制器類,看看它是如何注入了EntityManager:

@PersistenceContext 
private EntityManager em; 

又見控制器類(你的經理POJO的當量)有Stateless註釋。這是因爲只能在由Web容器管理其生命週期的對象中安全注入EJB(在此情況下爲EntityManager)(有關訪問Enterprise Bean的進一步參考,請參見here)。

+0

感謝您的信息,生病了看看。 – 2012-02-02 15:30:52

相關問題