2013-07-17 29 views
3

我嘗試運行與Hibernate和JPA基本應用程序,但現在我在運行應用程序時,我被困在這個異常...以下是下面的代碼和埃羅:休眠/ JPA:拋出:IllegalArgumentException:不是一個實體

java.lang.IllegalArgumentException: Not an entity: class pka.EclipseJPAExample.domain.Employee 
at org.hibernate.ejb.metamodel.MetamodelImpl.entity(MetamodelImpl.java:158) 
at org.hibernate.ejb.criteria.QueryStructure.from(QueryStructure.java:136) 
at org.hibernate.ejb.criteria.CriteriaQueryImpl.from(CriteriaQueryImpl.java:177) 
at pka.EclipseJPAExample.jpa.JpaTest.createEmployees(JpaTest.java:47) 
at pka.EclipseJPAExample.jpa.JpaTest.main(JpaTest.java:33) 

JpaTest.java:

public class JpaTest { 
private EntityManager manager; 
public JpaTest(EntityManager manager) { 
    this.manager = manager; 
} 
/** 
* @param args 
*/ 
public static void main(String[] args) { 
    EntityManagerFactory factory = Persistence.createEntityManagerFactory("persistenceUnit"); 
    EntityManager manager = factory.createEntityManager(); 
    JpaTest test = new JpaTest(manager); 

    EntityTransaction tx = manager.getTransaction(); 
    tx.begin(); 
    try { 
     test.createEmployees(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    tx.commit(); 

    test.listEmployees(); 

    System.out.println(".. done"); 
} 

private void createEmployees() { 
    CriteriaBuilder builder = manager.getCriteriaBuilder(); 
    CriteriaQuery<Employee> query = builder.createQuery(Employee.class); 
    query.from(Employee.class); 

    int numOfEmployees = manager.createQuery(query).getResultList().size(); 
    if (numOfEmployees == 0) { 
     Department department = new Department("java"); 
     manager.persist(department); 

     manager.persist(new Employee("Jakab Gipsz",department)); 
     manager.persist(new Employee("Captain Nemo",department)); 

    } 
} 


private void listEmployees() { 
    CriteriaBuilder builder = manager.getCriteriaBuilder(); 
    CriteriaQuery<Employee> query = builder.createQuery(Employee.class); 
    query.from(Employee.class); 
    List<Employee> resultList = manager.createQuery(query).getResultList(); 

    for (Employee next : resultList) { 
     System.out.println("next employee: " + next); 
    } 
} 
} 

和persistence.xml中:

....<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL"> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties> 

     <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 
     <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/testowa" /> 
     <property name="javax.persistence.jdbc.user" value="root" /> 
     <property name="javax.persistence.jdbc.password" value="enchantsql" /> 

     <property name="hbm2ddl.auto" value="create" /> 

     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />   
    </properties> 

</persistence-unit>.... 

你能指出問題出在哪裏?

編輯: 我忘了粘貼Employee類...所以這裏是下面:

@Entity 
@Table(name="Employee") 
public class Employee { 
@Id 
@GeneratedValue 
private Long id; 

private String name; 

@ManyToOne 
private Department department; 

public Employee() {} 

public Employee(String name, Department department) { 
    this.name = name; 
    this.department = department; 
} 


public Employee(String name) { 
    this.name = name; 
} 

public Long getId() { 
    return id; 
} 

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

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public Department getDepartment() { 
    return department; 
} 

public void setDepartment(Department department) { 
    this.department = department; 
} 

@Override 
public String toString() { 
    return "Employee [id=" + id + ", name=" + name + ", department=" 
      + department.getName() + "]"; 
} 

}

正如你可以看到它被映射。

+0

你上哪兒去映射你的pka.EclipseJPAExample.domain.Employee類配置實體? –

+0

您是否映射了「員工」類?通過註釋或'.hbm.xml'? – acdcjunior

+1

嘗試使用'@ Entity'註釋您的* Employee *類。我建議通過http://en.wikibooks.org/wiki/Java_Persistence/Mapping – elias

回答

5

請在實體確保@Entity註解。您還需要在persistence.xml

<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL"> 
<class>pka.EclipseJPAExample.domain.Employee</class> 
+0

你不應該需要persistence.xml部分,除非你使用早期的java ee版本。 – Kayaman

+0

現在,您直接在Java SE環境上運行。 – CycDemo

+0

其實也是如此。註釋的意思是讓你不需要寫出一個xml文件中的所有實體。 – Kayaman

相關問題