Hibernate一对多关联查询报错:未知实体org.example.model.Person
解决Hibernate一对多关联中"targets an unknown entity"异常
问题描述
拥有Person和Item两个实体类及对应数据库表,通过Hibernate配置一对多关联关系获取某个人的所有Item时,抛出如下异常:
Exception in thread "main" org.hibernate.AnnotationException: Association 'org.example.model.Item.owner' targets an unknown entity named 'org.example.model.Person' at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:97) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processEndOfQueue(InFlightMetadataCollectorImpl.java:1879) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processFkSecondPassesInOrder(InFlightMetadataCollectorImpl.java:1826) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1733) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:300) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:97) at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:402) at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:90) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:735) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:773) at org.example.App.main(App.java:23)
相关代码
Person实体类
package org.example.model; import jakarta.persistence.*; import java.util.List; @Entity @Table(name = "person") public class Person { @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Column(name = "name") private String name; @Column(name = "age") private int age; @OneToMany(mappedBy = "owner") private List<Item> items; public Person(String name, int age) { this.name = name; this.age = age; } public Person() { } // Getters and Setters public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public List<Item> getItems() { return items; } public void setItems(List<Item> items) { this.items = items; } @Override public String toString() { return "Person{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}'; } }
Item实体类
package org.example.model; import jakarta.persistence.*; @Entity @Table(name = "item") public class Item { @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Column(name = "item_name") String itemName; @ManyToOne @JoinColumn(name = "person_id", referencedColumnName = "id") private Person owner; public Item() { } public Item(String itemName) { this.itemName = itemName; } // Getters and Setters public int getId() { return id; } public void setId(int id) { this.id = id; } public String getItemName() { return itemName; } public void setItemName(String itemName) { this.itemName = itemName; } @Override public String toString() { return "Item{" + "id=" + id + ", itemName='" + itemName + '\'' + '}'; } }
App类
package org.example; import org.example.model.Item; import org.example.model.Person; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import java.time.Period; import java.util.List; public class App { public static void main(String[] args) { Configuration configuration = new Configuration() .addAnnotatedClass(Period.class).addAnnotatedClass(Item.class); SessionFactory sessionFactory = configuration.buildSessionFactory(); Session session = sessionFactory.getCurrentSession(); try { session.beginTransaction(); Person person = session.get(Person.class, 1); System.out.println(person); List<Item> items = person.getItems(); System.out.println(items); session.getTransaction().commit(); } finally { sessionFactory.close(); } } }
已尝试的无效方法
- 修改pom.xml中的依赖版本及Java版本并重新构建项目
- 重新编写实体类
- 检查数据库连接(确认连接正常,@Column注解可正确映射列名)
解决方案
问题根源在于Hibernate没有将Person类识别为实体类——在App类的Configuration配置中,错误地添加了Period.class(一个Java时间API类,并非实体),却遗漏了Person.class。当Hibernate处理Item类中的@ManyToOne关联时,找不到Person实体的元数据,因此抛出异常。
修改Configuration配置,移除Period.class并添加Person.class:
Configuration configuration = new Configuration() .addAnnotatedClass(Person.class).addAnnotatedClass(Item.class);
修改后的完整App类代码:
package org.example; import org.example.model.Item; import org.example.model.Person; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import java.util.List; public class App { public static void main(String[] args) { Configuration configuration = new Configuration() .addAnnotatedClass(Person.class).addAnnotatedClass(Item.class); SessionFactory sessionFactory = configuration.buildSessionFactory(); Session session = sessionFactory.getCurrentSession(); try { session.beginTransaction(); Person person = session.get(Person.class, 1); System.out.println(person); List<Item> items = person.getItems(); System.out.println(items); session.getTransaction().commit(); } finally { sessionFactory.close(); } } }
此外,建议在Item类中添加owner的getter和setter方法,确保关联关系的双向操作完整:
public Person getOwner() { return owner; } public void setOwner(Person owner) { this.owner = owner; }
内容的提问来源于stack exchange,提问作者BLADUS
相关产品推荐
相关产品推荐

