【问题标题】:Hibernate: "Use of @OneToMany targeting an unmapped classHibernate:“使用@OneToMany 定位未映射的类
【发布时间】:2016-10-27 13:26:25
【问题描述】:

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

我有两个班级:

@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;
}

所以语义是“一个用户可以教很多教程”。

但是当我启动我的应用程序时,我得到了异常:

"创建会话工厂失败 object.org.hibernate.AnnotationException:使用@OneToMany@ManyToMany 针对未映射的类: model.User.tutorial[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 子句的部分尚未经过测试。这就是功能,我接下来要实现。但在我能够做到这一点之前,抛出了异常。

我希望,这个例子很清楚。

【问题讨论】:

  • 在您的 persitence.xml 中,您是否使用类路径扫描来发现类?如果没有,是否列出了Tutorium?或者,有时会发生,Tutorium 中的 @Entity 注释不是来自 JPA 包吗?
  • 我还没有创建persistence.xml。因为link 的教程说,如果您使用注释,则不需要 xml-configfile... :O
  • 除了您的映射看起来不适合您想要的,正如发布的答案所述,我认为这不是您的问题的原因。看看stackoverflow.com/questions/4956855/…
  • @Stefan,据我了解 (tutorialspoint.com/hibernate/hibernate_annotations.htm),他们指的是 inside 每个实体类的映射信息。我很好奇你是如何尝试与你的班级一起工作的。你能在上面贴一个小sn-p吗?我想知道您是采用“休眠”还是“JPA”方式。
  • "persistence.xml" 在 JPA 中是强制性的,因此您的参考是错误的。查找任何不错的 JPA 教程

标签: java hibernate


【解决方案1】:

在这一行:

try{factory = new Configuration().configure().addAnnotatedClass(User.class).buildSessionFactory();}

你告诉 Hibernate User 是一个映射类。这是你告诉它的唯一一个类,所以这是它检查映射信息的唯一一个类。如果您希望它也将Tutorium 视为映射类,您也需要告诉它。只需将.addAnnotatedClass(Tutorium.class) 添加到配置调用链中即可。

【讨论】:

  • 非常感谢您,先生! :)
【解决方案2】:

您需要映射反向方式,例如如果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;
}

【讨论】:

  • 实际测试过。但是遇到了同样的例外...但是感谢您的帮助
  • 使用双向映射不是使用@OneToMany的要求。
  • @Brian 这是我从 Jboss Tools 生成的实体中引用的示例。您可以使用单向映射,但使用双向关系没有任何问题
  • @M.AtifRiaz 是的,在单向映射上使用双向映射并没有什么问题,除了如果不需要它的代码开销。它根本不能解决问题,只需查看问题中的错误,就可以知道。这就是为什么我根据 Stackoverflow 上的礼节,否决了你的答案并在我之前的评论中发布了原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多