2017-01-25 4 views
0

にロング・フィールドを設定することはできません私はどこかに間違い...
1人のプレイヤーが1つの統計表(oneToOne)JPAはロング

クラスのプレーヤーを持っていることを想定していますがあることを推測しますクラス統計:

@Component 
@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
@Table(name = "stats") 
public class Stats implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    @JsonView(View.Summary.class) 
    @Column(name = "id") 
    private Long id; 

    @OneToOne 
    @JoinColumn(name = "player_uid", referencedColumnName = "uid", nullable = false) 
    @JsonView(View.Summary.class) 
    private Player player; 
    .... 

クラスPlayerDAO:

public interface JPAPlayerDAO extends JpaRepository<Player, Long> { 
    Player findByUid(Long uid); 
    Player findByName(String name); 
} 

私はこれを行う場合、それは大丈夫です:

Player p = new Player(); 
p.setUid(123L); 
p.setName("Mike"); 
updater.saveOrUpdatePlayer(p); 
p = playerDAO.findOne() 

私は名前やUIDでそれを見つけるためにしようとすると、私はエラーを取得:

Player p = new Player(); 
p.setUid(123L); 
p.setName("Mike"); 
updater.saveOrUpdatePlayer(p); 
p = playerDAO.findByName("Mike") 
or 
p = playerDAO.findByUid(123L) 
.... 
Caused by: org.hibernate.property.access.spi.PropertyAccessException: Error accessing field... 
Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field ...entities.Player.uid to java.lang.Long 

私はそれはと間違って何かすることができることを考えます私のoneToOne参照。

+0

refを削除すると統計からuid @JoinColumn(name = "player_uid"、referencedColumnName = "uid")はすべて正常に動作します。しかし、私はそれが必要です。 – IgorZ

答えて

1

If I remove a ref. from stats to uid @JoinColumn (name = "player_uid", referencedColumnName = "uid"), all works well.

をこのような場合は、すでに述べたように問題が関連してすることができます。 JPA仕様によると、非プライマリキーのマッピングのサポートは、それがサポートされてはならないことを意味する、オプションです:

11.1.25 JoinColumn注釈

...

If the referencedColumnName element is missing, the foreign key is assumed to refer to the primary key of the referenced table.

Support for referenced columns that are not primary key columns of the referenced table is optional. Applications that use such mappings will not be portable.

ので、プロバイダがあるデフォルトを使用しますので、

@JoinColumn(name = "player_uid", referencedColumnName = "id") 

またはreferencedColumnNameを削除する:あなたはに注釈を変更する必要があります主キー(この場合はid)。

+0

もしそうなら、私はPlayerからidを削除し、次にuidを@idとして使用し、このuidにStatsをバインドすると思います。ありがとうございました。 – IgorZ

+1

はい、重要なのは、そのフィールドを 'Player'エンティティの主キーにすることです。 – ujulu

0

私はここにPlayerDAOの実装が必要だと思います。あなたはこののようになり、この

@Repository  
public interface JPAPlayerDAOImpl extends JPAPlayerDAO, JpaRepository<Player, Long> { 

    @Override 
    @Query("SELECT player FROM Player player WHERE player.uid =:uid") 
    Player findByUid(@Param("uid") Long uid); 

    @Override 
    @Query("SELECT player FROM Player player WHERE player.name =:name") 
    Player findByName(@Param("name") String name); 
} 

PlayerDAOような何かを試みることができる:

public interface JPAPlayerDAO { 
    Player findByUid(Long uid); 
    Player findByName(String name); 
} 
+0

JPAPlayerDAOはSpring Dataリポジトリインタフェースを使用するため、実装が自動的に作成されます。 – dunni

関連する問題