2014-03-21 2 views
1

У меня есть проблема с OneToMany аннотациюHibernate, OneToMany, AnnotationException

@Entity 
@Table(name = "RESULT_HISTORY") 
public class ResultHistoryImpl implements ResultHistory, Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 


    @OneToMany 
    private final Set<Game> games = new HashSet<>(); 


... 

} 

и класс

@Entity 
@Table(name = "GAME") 
public class GameImpl implements Game, Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 

    ... 
} 

Я больше полей, сеттеры/добытчиками и конструкторы

Я использую весной и в мои файлы конфигурации У меня есть пакетыToScan, где я помещал пакеты этих классов

Проблемы заключается в том, что я получаю org.hibernate.AnnotationException: Использование @OneToMany или @ManyToMany ориентации неподключенного класса

Я прочитал много тем на StackOverflow, так что проблема не использует org.hibernate.annotation и т.д.

ответ

3

То, что вы пробовали, не представляется возможным. Game - это интерфейс, и вы не можете сопоставить интерфейс с БД, потому что hibernate не знает, какую реализацию использовать. Но что вы можете сделать, это

  1. использовать во всех ваших классах объектов непосредственно класс GameImpl. Я имею в виду исправить ResultHistoryImpl класс следующим образом: @OneToMany private final Set<GameImpl> games = new HashSet<GameImpl>();
  2. Если вы хотите иметь другую абстракцию, добавить абстрактный класс AbstractGame implements Game и аннотировать его с @Entity и использовать его вместо интерфейса Game.
+0

Я понимаю, но проблема в том, что реализация игры в другом модуле, и у меня есть доступ только к моим коллегам public api (игровой интерфейс), и я не могу его изменить. – Yeynno

+0

Я обновил свой ответ. –

0

Использовать аннотацию @MappedSuperclass для игры.

+0

не работает – Yeynno

+0

Является ли исключение тем же? Я думаю, вы должны попытаться объединить @MappedSuperclass и mappedBy, как описано toni77 ниже. Просто, чтобы быть ясным: используют аннотацию @MappedSuperclass в интерфейсе игры следующим образом: '@MappedSuperclass Открытый интерфейс Game {...}' –

0

Для @OneToMany вы должны предоставить свойство mappedBy, которое указывает на имя поля в другом классе. В вашем случае:

public class ResultHistoryImpl { 
... 
    @OneToMany(mappedBy = "resultHistory") 
    private final Set<GameImpl> games = new HashSet<>(); 
} 

public class GameImpl { 
    @ManyToOne 
    @JoinColumn(name = "result_history") 
    private ResultHistoryImpl resultHistory; 
} 
+0

Не работает. Почему вы используете ResultHistoryImpl вместо интерфейса в классе GameImpl? – Yeynno

+0

Андрей Иванович прав, вы не можете сопоставлять интерфейсы с БД. – kavai77

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