簡體   English   中英

Hibernate/JPA:IllegalArgumentException:不是實體

[英]Hibernate/JPA : IllegalArgumentException: Not an entity

我嘗試使用 hibernate 和 jpa 運行一個基本的應用程序,但是現在我在運行應用程序時遇到了這個異常……這是下面的代碼和錯誤:

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() + "]";
}

}

如您所見,它已被映射。

確保您的實體中有@Entity注釋。 你還需要在persistence.xml配置一個實體

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

如果您的應用程序中有許多 ENTITY 類,那么在“persistence.xml”中為每個實體添加一個條目將不是一個好的選擇。

相反,使用自定義自動配置創建您自己的數據源 bean。

在 dataSource bean 創建方法中使用 LocalContainerEntityManagerFactoryBean。

在這里,您需要定義

LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new
LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setPackagesToScan("org.springframework.boot.entities");

這個包是保存所有實體類的位置。 因此無需在“persistence.xml”中定義實體類的每個條目。

首選基於 Spring 的掃描。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM