2013-05-08 43 views
0

我正在學習作業,但在試圖將我的實體保存到mysql數據庫時不斷收到java.lang.IllegalArgumentException 。這個項目使用JPA,EJB,JSF,Glassfish和連接池。請注意,這是一個新的Java Web開發。java.lang.IllegalArgumentException:對象:[email protected]不是已知的實體類型

實體:

import javax.inject.Named; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Id; 

import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 

import javax.persistence.Table; 


@Named 
@ConversationScoped 
@Entity 
@Table(name = "BOOKS") 
public class Book implements Serializable{ 

     private static final long serialVersionUID = 1L; 

     @Id 
     @Column(name = "BOOK_ID") 
     @GeneratedValue(strategy = GenerationType.AUTO) 
     private long bookId; 

     @Column(name = "TITLE") 
     private String title; 

     @Column(name = "AUTHOR") 
     private String author; 

     @Column(name = "PRICE") 
     private int price; 

     public Book(){ 

     } 

     public Long getBookId() { 
       return bookId; 
     } 

     public void setBookId(Long bookId) { 
       this.bookId = bookId; 
     } 

     public String getTitle() { 
       return title; 
     } 

     public void setTitle(String title) { 
       this.title = title; 
     } 

     public String getAuthor() { 
       return author; 
     } 

     public void setAuthor(String author) { 
       this.author = author; 
     } 

     public int getPrice() { 
       return price; 
     } 

     public void setPrice(int price) { 
       this.price = price; 
     } 

}//end class 

DAO對象:

import java.util.List; 


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



@Stateless 
@LocalBean 
public class BookDaoBean implements BookDao { 


    @PersistenceContext 
    private EntityManager entityManager; 


    @SuppressWarnings("unchecked") 
    public List<Book> getBooks() { 

     List<Book> matchingBooksList; 

     Query query = entityManager.createQuery("SELECT s FROM Book s"); 

     matchingBooksList = query.getResultList(); 

     return matchingBooksList; 
    } 


    @Override 
    public void saveBook(Book book) { 

     if(book.getAuthor() != null){ 


      entityManager.persist(book); 


     }else{ 

      System.out.println("Book object id is " + book.getBookId()); 

     } 

    } 

}//end class 

控制器:

import javax.ejb.EJB; 
import javax.enterprise.context.Conversation; 
import javax.enterprise.context.RequestScoped; 
import javax.inject.Inject; 
import javax.inject.Named; 

import se.nackademin.BeachBoysSweden.DAO.BookDaoBean; 
import se.nackademin.BeachBoysSweden.entities.Book; 



@Named 
@RequestScoped 
public class BookController { 

    @EJB 
    private BookDaoBean bookDao; 
    @Inject 
    private Book book; 
    @Inject 
    private Conversation conversation; 

    public String enterForm(){ 
     conversation.begin(); 
     System.out.print("enter form"); 
     return "form"; 
    } 

    public String goToConfirmation(){ 
     return "confirmation"; 

    } 

    public String saveBook(){ 
     bookDao.saveBook(book); 
     conversation.end(); 
     return "list"; 
    } 

} 

的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.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_1_0.xsd"> 
    <persistence-unit name="book4PersistenceUnit" 
     transaction-type="JTA"> 
     <jta-data-source>jdbc/__BookPool</jta-data-source> 
     <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    </persistence-unit> 
</persistence> 

根情況:

WARNING: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception 
java.lang.IllegalArgumentException: Object: [email protected] is not a known entity type. 
    at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.registerNewObjectForPersist(UnitOfWorkImpl.java:4169) 
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.persist(EntityManagerImpl.java:440) 
    at com.sun.enterprise.container.common.impl.EntityManagerWrapper.persist(EntityManagerWrapper.java:269) 
+0

請考慮提供一個[SSCCE](http:/www.sscce.org):它不僅可以讓別人更容易幫助您,您可以通過編寫它找到問題(或者至少是某種東西)。 – wchargin 2013-05-08 20:21:37

回答

0

由於您使用了帶註釋的類。你必須告訴休眠哪些文件可以被掃描註釋。

<persistence-unit name="book4PersistenceUnit" 
     transaction-type="JTA"> 
    <!-- Explicitly define entities in class tags --> 
    <class>Book</class> 

    <properties> 
      <!-- Scan for annotated classes and Hibernate mapping XML files --> 
      <property name="hibernate.archive.autodetection" value="class, hbm"/> 
    </properties> 
</persistence-unit> 
+0

sry但我沒有使用休眠。 – 2013-05-08 20:27:01

+0

如果自動檢測對您來說不是真的需要,您可以通過在持久單元中添加 Book來明確識別哪些類是實體。在明確定義類的情況下,您不需要自動檢測屬性。 – Sqeezer 2013-05-08 20:37:16

+0

試圖在persistence.xml中添加以下行\t \t se.nackademin.BeachBoysSweden.entities.Book 但問題依然存在:( – 2013-05-08 20:51:26

0

嘗試增加使用

<class>Book</class> 

嘗試刪除類,

<exclude-unlisted-classes>false</exclude-unlisted-classes> 

確保您類是部署在同一個JAR /耳爲你的會話bean。

確保您使用的是正確的持久性單元。

如果您要重新部署,請嘗試重新啓動Glassfish服務器,您可能在取消部署時遇到了一些問題。

相關問題