Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 冬眠:“;针对未映射类使用@OneToMany_Java_Hibernate - Fatal编程技术网

Java 冬眠:“;针对未映射类使用@OneToMany

Java 冬眠:“;针对未映射类使用@OneToMany,java,hibernate,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 S

我以前搜索过这个异常。但我的问题没有解决办法

我有两门课:

@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;
}
所以语义是“一个用户可以教很多教程”

但当我启动应用程序时,会出现以下异常:

“未能创建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();
        }
    }
}
import org.hibernate.Session;
导入org.hibernate.SessionFactory;
导入org.hibernate.Transaction;
导入org.hibernate.cfg.Configuration;
导入javax.persistence.TypedQuery;
导入javax.persistence.criteria.CriteriaBuilder;
导入javax.persistence.criteria.CriteriaQuery;
公共类用户筛选器{
私营静电厂;
公共用户筛选器(){
请尝试{factory=new Configuration().configure().addAnnotatedClass(User.class).buildSessionFactory();}
捕获(例外e){}
}
公共集合getUser(){
Session Session=factory.openSession();
事务t=null;
试一试{
t=session.beginTransaction();
CriteriaBuilder cb=session.getEntityManagerFactory().getCriteriaBuilder();
Join tutoria=this.root().Join(“tutoria”);
CriteriaQuery输出=cb.createQuery(User.class);
output.groupBy(this.root().get(“id”);
TypedQuery q=session.getEntityManagerFactory().createEntityManager().createQuery(输出);
List users=q.getResultList();
返回用户;
}
捕获(例外e){}
最后{
session.close();
}
}
}
带有join和groupBy子句的部分尚未测试。这就是我想要实现的功能。但在我能够这样做之前,异常被抛出


我希望,,示例非常清楚。

您需要反向映射,例如,如果
User
是父表,
Tutorium
是子表,您将在
User
类中放置
mappedBy
属性,对于子表
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;
}
@实体
@表(name=“user”)
公共类用户{
@Id@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”)
私有int-id;
@OneToMany(mappedBy=“用户”)
私人设置教程a;
}
@实体
@表(name=“tutorium”)
公共课堂辅导{
@Id@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”)
私有int-id;
@许多酮
@JoinColumn(name=“id”)
私人用户;
}

您需要反向映射,例如,如果
User
是父表而
Tutorium
是子表,您将在
User
类中放置
mappedBy
属性,对于子表
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;
}
@实体
@表(name=“user”)
公共类用户{
@Id@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”)
私有int-id;
@OneToMany(mappedBy=“用户”)
私人设置教程a;
}
@实体
@表(name=“tutorium”)
公共课堂辅导{
@Id@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”)
私有int-id;
@许多酮
@JoinColumn(name=“id”)
私人用户;
}
在这行中:

try{factory = new Configuration().configure().addAnnotatedClass(User.class).buildSessionFactory();}
您告诉Hibernate,
User
是一个映射类。这是您告诉它的唯一一个类,所以这是它检查映射信息的唯一一个类。如果您希望它也将
Tutorium
视为映射类,您也需要告诉它这一点。只需将
.addAnnotatedClass(Tutorium.class)
添加到配置调用链中就可以了。

在这一行:

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

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

在persistence.xml中,是否使用类路径扫描来发现类?如果没有,是否列出
Tutorium
?或者,
Tutorium
中的
@Entity
注释不是来自JPA包吗?我没有创建persistence.xml。因为在的教程中提到,如果使用注释,则不需要xml配置文件…:尽管你的映射看起来与你想要的不符,正如在贴出的答案上所说的,我认为这不是你问题的原因。看看@Stefan,据我所知(),它们引用的是每个实体类中的映射信息。我很好奇你是如何与你的班级合作的。你能在上面贴一个小片段吗?我想知道您是采用“Hibernate”还是“JPA”方式。“persistence.xml”在JPA中是强制性的,因此您的引用是错误的。在persistence.xml中找到合适的JPA教程,您是否使用类路径扫描来发现类?如果没有,是否列出
Tutorium
?或者,
Tutorium
中的
@Entity
注释不是来自JPA包吗?我没有创建persistence.xml。因为在的教程中提到,如果使用注释,则不需要xml配置文件…:尽管你的映射看起来与你想要的不符,正如在贴出的答案上所说的,我认为这不是你问题的原因。看看