2014-02-23 236 views
0

我想做一个非常简单的事情,但无法让它工作。休眠映射JPA集合

我有ab实体游戏和实体玩家。每场比赛应该有两个来自球员的外键。它有效,但有一个问题:我不能将来自Player的同一个外键分配给多个游戏实体。这个限制来自哪里,我怎么告诉他不要那样做?

我正在使用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 
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

:在您的播放器

@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

This引发此: 引起:org.hibernate.MappingException:实体映射中的重复列:com.sc2tube.entities.beans.Player列:id(应插入insert =“false”update =“false”) – Vertago

+0

这个例外很具描述性。你是否想要使用两次“id”列?你可以编辑和发布你的'Player'实体吗? – fonkap

+0

我现在清理了很多,现在他至少不会抛出错误。但是现在他忘记了玩家对游戏的映射。现在看起来像这样(编辑:移动到开始帖子) – Vertago