Hibernate:“使用@OneToMany定位未映射的类

时间:2016-10-27 13:26:26

标签: java hibernate

我之前搜索过这个例外。但没有解决方案可以解决我的问题。

我有两个班级:

@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子句的部分尚未测试。这就是功能,我想接下来实施。但在我能够做到这一点之前,抛出了异常。

我希望,这个例子大多是清楚的。

3 个答案:

答案 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<>();

上一篇文章中的双向解决方案在大多数情况下是更好的设计,无需使用连接表。