Java JPA无法将Long字段设置为Long

Java JPA无法将Long字段设置为Long,java,hibernate,spring-boot,spring-data-jpa,Java,Hibernate,Spring Boot,Spring Data Jpa,我想我在某处犯了个错误… 假设一个玩家有一个统计表(oneToOne) 职业球员: @Component @Entity @Table(name = "player") public class Player { @Id @GeneratedValue @JsonView(View.Summary.class) @Column(name = "id") private Long id; @Column(name = "uid", unique

我想我在某处犯了个错误…
假设一个玩家有一个统计表(oneToOne)

职业球员:

@Component
@Entity
@Table(name = "player")
public class Player {

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

    @Column(name = "uid", unique = true, nullable = false)
    @JsonView(View.Summary.class)
    private Long uid;

    @OneToOne(mappedBy = "player", cascade = CascadeType.ALL)
    @JsonView(View.Summary.class)
    private Stats stats;
    ....
班级统计:

@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;
    ....
班主任道:

public interface JPAPlayerDAO extends JpaRepository<Player, Long> {
    Player findByUid(Long uid);
    Player findByName(String name);
}
如果尝试按名称或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

我认为我的OneTone参考可能有问题。

我认为您需要在这里实现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);
}

如果我从stats中删除一个对uid@JoinColumn(name=“player\u uid”,referencedColumnName=“uid”)的引用,那么一切都很好

如果是这种情况,问题可能与您已经提到的关联有关。 根据JPA规范,对非主键映射的支持是可选的,这意味着必须不支持:

11.1.25柱注释

如果缺少referencedColumnName元素,则假定外键引用被引用表的主键

对不是被引用表主键列的被引用列的支持是可选的。使用此类映射的应用程序将无法移植

因此,应将注释更改为:

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

或者删除
referencedColumnName
,因为提供程序将使用默认值,即主键(在本例中为
id
)。

JPAPlayerDAO使用Spring数据存储库接口,因此实现将自动创建。如果我从stats中删除一个对uid@JoinColumn(name=“player\u uid”,referencedColumnName=“uid”),一切正常。但我需要它。如果是这样,我想我会从玩家中删除id,然后将uid用作@id并将统计数据绑定到此uid。谢谢。是的,重要的是您将该字段作为
玩家
实体的主键。
public interface JPAPlayerDAO {
   Player findByUid(Long uid);
   Player findByName(String name);
} 
@JoinColumn(name = "player_uid", referencedColumnName = "id")