2013-07-17 4 views
3

Я пытаюсь запустить базовое приложение с Hibernate и JPA, но теперь я застрял на это исключение при запуске приложения ... Вот код и Эрро ниже:Hibernate/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>.... 

Не могли бы вы указать, где проблема?

EDIT: Я забыл вставить класс 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

Вы отобразили класс 'Employee'? Через аннотацию или '.hbm.xml'? – acdcjunior

+1

Попробуйте аннотировать свой * Employee * класс с помощью '@ Entity'. Я рекомендую читать через 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

Смежные вопросы