我之前搜索过这个例外。但没有解决方案可以解决我的问题。
我有两个班级:
@Entity
@Table(name = "user")
public class User {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@OneToMany
@JoinColumn(name = "tutor_id")
private Set<Tutorium> tutoria;
}
和
@Entity
@Table(name = "tutorium")
public class Tutorium {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Colum(name = "tutor_id")
private int tutor_id;
}
所以语义是“一个用户可以教许多教师”。
但是当我开始申请时,我得到了例外:
“无法创建sessionFactory object.org.hibernate.AnnotationException:使用
@OneToMany
或@ManyToMany
定位到未映射的类: model.User.tutoria [model.Tutorium]”。
有谁知道,我怎么能解决这个问题?
编辑:
尝试给出一个关于我如何访问类的小例子:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
public class UserFilter {
private static SessionFactory factory;
public UserFilter() {
try{factory = new Configuration().configure().addAnnotatedClass(User.class).buildSessionFactory();}
catch(Exception e) {}
}
public Collection<User> getUser() {
Session session = factory.openSession();
Transaction t = null;
try{
t = session.beginTransaction();
CriteriaBuilder cb = session.getEntityManagerFactory().getCriteriaBuilder();
Join<User, Tutorium> tutoria = this.root().join("tutoria");
CriteriaQuery output = cb.createQuery(User.class);
output.groupBy(this.root().get("id"));
TypedQuery q = session.getEntityManagerFactory().createEntityManager().createQuery(output);
List users = q.getResultList();
return users;
}
catch(Exception e) {}
finally {
session.close();
}
}
}
具有join和groupBy子句的部分尚未测试。这就是功能,我想接下来实施。但在我能够做到这一点之前,抛出了异常。
我希望,这个例子大多是清楚的。
答案 0 :(得分:2)
在这一行:
try{factory = new Configuration().configure().addAnnotatedClass(User.class).buildSessionFactory();}
你告诉Hibernate User
是一个映射类。这是你告诉它的唯一一个类,所以这是它检查映射信息的唯一一个类。如果您希望它也将Tutorium
视为映射类,您还需要告诉它。只需将.addAnnotatedClass(Tutorium.class)
添加到配置调用链中即可。
答案 1 :(得分:-1)
您需要以反向方式映射,例如如果User
是父表,而Tutorium
是子表,则会将mappedBy
属性放在User
类中,对于子表Tutorium
,您将使用@JoinColumn
它将引用父类中的外键列。见下面的代码
@Entity
@Table(name = "user")
public class User {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@OneToMany(mappedBy = "user")
private Set<Tutorium> tutoria;
}
@Entity
@Table(name = "tutorium")
public class Tutorium {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@ManyToOne
@JoinColumn(name = "id")
private User user;
}
答案 2 :(得分:-1)
对于单向一对多关系,您需要一个连接表,这是我经验中不常使用的原因。
您需要替换:
@OneToMany
@JoinColumn(name = "tutor_id")
private Set<Tutorium> tutoria;
类似于:
@OneToMany
@JoinTable(name = "user_tutorium",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "tutorium_id"))
private Set<Tutorium> tutoria = new HashSet<>();
上一篇文章中的双向解决方案在大多数情况下是更好的设计,无需使用连接表。