2013-10-25 3 views
1

Я борюсь с отображением двунаправленной связи «один ко многим» с составными первичными ключами на основе entites. Я создал несколько классов, которые представляют, что я хочу делать. Они просто сделаны, поэтому их легче объяснить, но я думаю, что они сообщают, что я пытаюсь сделать хорошо.Двунаправленная связь OneToMany с составным ключом объекта вызывает нулевой идентификатор

Я упустил реализацию некоторых интерфейсов/методов, но я могу гарантировать, что он будет работать, если я не добавлю набор турниров в объект Player/Game. Так что с моим сопоставлением что-то не так.

Когда я пытаюсь найти объект (почти ничего не делаю), Hibernate 4.x вызывает ошибку с идентификатором нулевого значения, не говоря уже об ошибке.

Что было бы правильным способом сопоставить это, когда у меня есть составной первичный ключ на «одном», и я хочу двунаправленную навигацию?

@Entity 
@IdClass(TournamentPk.class) 
public class Tournament { 

    @Id 
    @ManyToOne 
    @JoinColumn("player_id") 
    private Player player; 
    @Id 
    @ManyToOne 
    @JoinColumn("game_id") 
    private Game game; 
    private int score; 

    // Getters and Setters 
    // Hashcode and Equals 
} 

// Primary key class. 
public class TournamentPk { 

    private Player player; 
    private Game game; 

    // Getters and Setters 
    // Hashcode and Equals 
} 


@Entity 
public class Player { 

    // ID 
    // Other fields 

    @OneToMany(fetchType = FetchType.EAGER, mappedBy = "player") 
    private Set<Tournament> tournaments; 

    // Getters and Setters 
    // Hashcode and Equals 
} 

@Entity 
public class Game { 

    // ID 
    // Other fields 

    @OneToMany(fetchType = FetchType.EAGER, mappedBy = "game") 
    private Set<Tournament> tournaments; 

    // Getters and Setters 
    // Hashcode and Equals 
} 
+0

Попробуйте использовать '@ EmbeddedId' вместо' @ IdClass' – Simon

+0

могли бы вы предоставить точное сообщение исключение? Ошибка возникает, когда вы пытаетесь найти объект какого типа? –

ответ

2

Ваша проблема заключается в том, что вы с аннотацией @Id полей не-разрешенных типов (например типа Player и Game). См. Документацию аннотации @Id для получения более подробной информации.

Примечание для полноты: some references позволяют иметь еще один класс Entity, аннотированный с помощью @Id.

  1. На вашем месте я бы независимое @Id private Long id; поле в вашем Tournament лица + в @Unique ограничение на игры + комбинации игрока со стандартным отображением.
  2. Если вы действительно хотите придерживаться @IdClass, вы можете попробовать добавить два разрешенных поля в свой турнирный класс (я нашел аналогичное отображение here (поиск по @IdClass)).

@Entity 
    @IdClass(TournamentPk.class) 
    public class Tournament { 

    @Id 
    @Column(name="player_id", insertable = false, updatable = false) 
    private Long playerId; 

    @ManyToOne 
    @JoinColumn("player_id")//consider adding cascade=PERSIST 
    private Player player; 

    @Id 
    @Column(name="game_id", insertable = false, updatable = false) 
    private Long gameId; 

    @ManyToOne 
    @JoinColumn("game_id")//consider adding cascade=PERSIST 
    private Game game; 
    private int score; 

    // Getters and Setters 
    // Hashcode and Equals 
} 

    public class TournamentPk { 

    private Long playerId; 
    private Long gameId; 

    // Getters and Setters 
    // Hashcode and Equals 
} 
+0

Да, я понял, что использование объекта как ПК не работает, поэтому я изменил на встроенный и использовал то же самое отображение, которое вы написали. Но когда я это сделал, я получил дублированное сопоставление столбцов (столбец и joincolumn имеют одинаковые имена), поэтому мне пришлось добавить insertable = false и updateable = false. Однако, когда я сохраняю, я не получаю запись в базе данных. – LuckyLuke

+0

Вы имеете в виду, что вы пробовали решение 2 ('@ IdClass', а не' @ EmbeddedId'). Я добавил 'updatable = false, insertable = false' в мой код, спасибо. Вы уверены, что не получите исключения, когда пытаетесь сохранить запись (это трудно поверить в это)? Если вы его получите, отправьте стек. Что вы думаете о решении 1? Вы пытались/думали использовать '@ EmbeddedId' вместо' @ IdClass'? –

+0

Я изменил подход 1, я думаю, что я на один шаг ближе, используя простые поля в встраиваемом идентификаторе и другом наборе manytoone. Я думаю, что это правильно. Я должен посмотреть на это завтра. Я опубликую то, что найду. – LuckyLuke

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