2016-10-27 2 views
0

Я искал это исключение раньше, но не решения работало для моей проблемыHibernate:. «Использование @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».

Но когда я ул arting мое заявление, я получаю исключение:

«Не удалось создать SessionFactory object.org.hibernate.AnnotationException: Использование @OneToMany или @ManyToMany таргетирования неподключенному класс: model.User.tutoria [model.Tutorium ]».

Кто-нибудь знает, как я могу решить эту проблему?

Edit:

Попытка дать вам небольшой пример того, как я доступ к классам:

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

Часть с присоединиться и группеПо придаточного пока не тестировалась. Это была функция, которую я хотел реализовать дальше. Но прежде чем я смог это сделать, было исключено исключение.

Надеюсь, пример в основном прозрачный.

+2

В вашей настойчивости.xml, вы используете сканирование путей для поиска классов? Если нет, есть ли «Tutorium»? Или иногда бывает, что аннотация '@ Entity' в« Tutorium »не из пакета 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 Это пример, который я цитирую из Entity, созданного Jboss Tools. Вы можете использовать однонаправленное сопоставление, но нет ничего неправильного в использовании двунаправленных отношений. –

-1

Для однонаправленного один ко многим отношений вам нужно Join таблицы, и это является причиной, из моего опыта, которые реже используются.

Вы должны заменить:

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

Двунаправленный раствор из предыдущего поста, в большинстве случаев лучше конструкция исключает необходимость в Join таблицы.

+0

Не является ли JoinTable таблицей «tutorium» в моем случае? Поскольку внешний ключ находится в «tutorium» -table, столбец «tutor_id», который ссылается на идентификатор (первичный ключ) таблицы пользователя. – Stefan

+0

@Stefan В приведенном выше примере будет создана новая таблица с именем «user_tutorium». A JoinColumn может быть создан на стороне ManyToOne отношений. У вас не может быть JoinColumn в отношениях OneToMany. Опять исключая OneToMany от пользователя и добавляя пользователя ManyToOne в Tutorium, мне кажется лучше для вашего дела. – garfield

+0

Отношения '@ OneToMany', даже однонаправленные, не требуют таблицы соединений. «@ ManyToMany» делает. – Brian

Смежные вопросы