2014-02-23 4 views
0

Я хочу сделать довольно простую вещь, но не могу заставить ее работать.Hibernate Mapping JPA Collections

У меня есть сущность игры и игрок сущности. Каждая игра должна иметь два внешних ключа от Игроков. И это работает, но есть один улов: я не могу назначить один и тот же внешний ключ от Игрока к нескольким игровым объектам. Откуда это ограничение, и как я могу сказать ему, чтобы он не делал этого?

Я использую Hibernate и JPA. Моя persistence.xml выглядит следующим образом:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence" version="1.0"> 
<persistence-unit name="PlayerService" transaction-type="RESOURCE_LOCAL"> 
<provider>org.hibernate.ejb.HibernatePersistence</provider> 
<properties> 
    <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/> 
    <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/> 
    <property name="hibernate.connection.username" value="********"/> 
    <property name="hibernate.connection.password" value="********"/> 
    <property name="hibernate.connection.url" value="jdbc:postgresql://********"/>   
    <property name="hibernate.hbm2ddl.auto" value="create"/>   
</properties> 
</persistence-unit> 
</persistence> 

Я получаю EntityManager за:

util = new JPAUtil(); 
emf = Persistence.createEntityManagerFactory("PlayerService"); 
em = emf.createEntityManager(); 
em.getTransaction().begin(); 

в моей игры-Сущности:

@ElementCollection(targetClass=Player.class) 
private Collection<Player> player; 

и есть плеер-Entity.

Я делаю это совершенно неправильно?


@Entity 
public class Game { 

    @Id 
    int gameid; 

    @OneToMany(mappedBy="game") 
    private Collection<TestPlayer> test; 
} 

@Entity 
public class TestPlayer { 

@Id 
int id; 

@ManyToOne 
@JoinColumn(name="gameid") 
private Game game; 
} 
+0

Когда вы говорите, что я не могу, вы получаете какие-либо ошибки при назначении внешнего ключа? Если да, сообщите нам об ошибке. –

+0

Вызвано: org.postgresql.util.PSQLException: ОШИБКА: дублирующее значение ключа нарушает уникальное ограничение «...» Подробнее: Key (player_playerid) = (1) уже существует. Как сказано, это не намерено, потому что во многих играх может быть один и тот же игрок. – Vertago

+0

Пожалуйста, отредактируйте этот вопрос и добавьте ошибку, чтобы получить правильные ответы. –

ответ

0

Постараюсь в OneToMany отношения вместо ElementCollection.

Я думаю, что в ElementCollection элементы (Player) принадлежит к Game и, следовательно, Hibernate не позволяет назначить его нескольким Games

в вашей игре Entity:

@OneToMany(mappedBy="game") 
private Collection<Player> player; 

в проигрывателе объект:

@ManyToOne 
@JoinColumn(name="game_id") 
private Game game; 

для справки: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#entity-mapping-association

+0

Это делает это: Вызвано: org.hibernate.MappingException: Повторяющийся столбец в сопоставлении для объекта: com.sc2tube.entities.beans.Player column: id (должен быть сопоставлен с insert = "false" update = "false") – Vertago

+0

Исключение является довольно описательным. Вы пытаетесь использовать столбец 'id' дважды? Не могли бы вы отредактировать и опубликовать свой объект 'Player'? – fonkap

+0

Я убирал много сейчас, и теперь он, по крайней мере, не бросает ошибку. Но теперь он забывает о картировании игрока в игре. Теперь это выглядит так: (отредактируйте: переместили его в начальный пост) – Vertago