2016-10-27 172 views
0

我搜索了此異常出現,但沒有辦法使用工作了我的問題休眠:「@OneToMany的目標未映射類

我有兩個類:

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

所以語義是「一個用戶可以教很多tutoria」。

但是當我ST arting我的申請,我得到異常:

「無法創建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(); 
     } 
    } 
} 

的部分與加入和GROUPBY子句尚未被測試。那是我想要實施的功能。但是在我能夠做到這一點之前,拋出了異常。

我希望這個例子大多清楚。

+2

在你的懷抱。xml,你是否使用類路徑掃描來發現類?如果沒有,是否列出了「Tutorium」?或者,有時會發生'Tutorium'中的'@ Entity'註釋不是來自JPA包? – Brian

+0

我沒有創建一個persistence.xml。因爲[link](https://www.tutorialspoint.com/hibernate/)上的教程說,如果使用註釋,則不需要xml-configfile ...:O – Stefan

+0

除了映射看起來像這樣的事實對於你想要的東西是錯的,就像在發佈的答案中所說的那樣,我認爲這不是你問題的原因。看看http://stackoverflow.com/questions/4956855/hibernate-problem-use-of-onetomany-or-manytomany-targeting-an-unmapped-clas –

回答

2

在這一行:

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

你告訴Hibernate中進行User是映射類。這是你講述的唯一一門課,所以這是唯一一個爲繪圖信息檢查的課程。如果你想要它也把Tutorium當作映射類,你也需要告訴它。只需將.addAnnotatedClass(Tutorium.class)添加到配置調用鏈中即可。

+0

非常感謝,先生! :) – Stefan

-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; 
} 
+0

實際測試過它。但得到了同樣的例外......但是,感謝您的幫助 – Stefan

+0

使用'@ OneToMany'不需要使用雙向映射。 – Brian

+0

@Brian這是我從Jboss Tools生成的實體引用的示例。您可以使用單向映射,但使用雙向關係沒有任何問題 –

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

從原來職位的雙向解決方案,在大多數情況下更好的設計省去了連接表的需要。

+0

是不是JoinTable表中的「tutorium」在我的情況?由於外鍵位於「教程」中,因此可以使用「tutor_id」列來引用用戶表的(主鍵)標識。 – Stefan

+0

@Stefan在上例中,將創建一個名爲「user_tutorium」的新表。 JoinColumn可以在關係的ManyToOne方面創建。 OneToMany關係中不能有JoinColumn。再次從用戶中刪除OneToMany並將ManyToOne用戶添加到Tutorium對我來說最適合您的情況。 – garfield

+0

「@ OneToMany」關係,即使是單向的,也不需要連接表。一個'@ ManyToMany'確實。 – Brian