4

我尝试使用 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() + "]";
}

}

如您所见,它已映射。

4

2 回答 2

6

确保@Entity在您的实体中添加注释。您还需要在persistence.xml

<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
<class>pka.EclipseJPAExample.domain.Employee</class>
于 2013-07-17T12:11:22.163 回答
0

如果您的应用程序中有许多 ENTITY 类,那么在“persistence.xml”中为每个实体添加一个条目将不是一个好的选择。

相反,使用自定义自动配置创建您自己的数据源 bean。

在 dataSource bean Creation 方法中使用 LocalContainerEntityManagerFactoryBean 。

在这里,您需要定义

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

这个包是所有实体类的保存位置。因此,无需在“persistence.xml”中为实体类定义每个条目。

首选基于 Spring 的扫描。

于 2019-06-20T19:01:57.093 回答