如何解决Spring boot实体类中出现NullPointerException问题

问题描述 投票:0回答:1

下面是我编写的定义实体类的代码,这些代码在编译时没有真正的问题,但在运行时确实有问题。

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "evolutions")
@IdClass(value = EvolutionPkey.class)
public class Evolution {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "pokemon_id")
    private int pokemonId;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "form_id")
    private int formId;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "next_pokemon_id")
    private int nextPokemonId;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "next_form_id")
    private int nextFormId;

    @Column(nullable = false)
    private int stage;

    @ManyToOne
    @JoinColumn(name = "pokemon_id", referencedColumnName = "pokemon_id")
    private Pokemon pokemon;

}

@Data
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class EvolutionPkey implements Serializable{
    public int pokemonId;
    public int formId;
    public int nextPokemonId;
    public int nextFormId;
}

public class Pokemon {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "pokemon_id")
    private int pokemonId;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "form_id")
    private int formId;

    ・・・・

    @OneToMany(mappedBy = "pokemon", cascade=CascadeType.ALL)
    private List<Evolution> evolutions;
}

实际使用存储库实例获取下面服务类中的信息时,会出现问题,并且会抛出 NullPointerException。


pokemonRepository.findByPokemonId(pokemonId)

@Autowired 私人 PokemonRepository pokemonRepository;

・・・

pokemonRepository接口代码如下:

public interface PokemonRepository extends JpaRepository<Pokemon, PokemonPkey>, JpaSpecificationExecutor<Pokemon> {
    public Optional<List<Pokemon>> findByPokemonId(int pokemonId);

}

出现的错误信息如下:

Resolved [java.lang.NullPointerException: Cannot invoke "org.hibernate.metamodel.mapping.AttributeMapping.getStateArrayPosition()" because the return value of "org.hibernate.persister.entity.AbstractEntityPersister.findAttributeMapping(String)" is null]

如果有人对如何解决这个问题有一些想法,那就太好了! 谢谢!

我尝试了其他几种书写方式,但从未成功......

java spring spring-boot spring-data-jpa entity
1个回答
0
投票

接口实现错误。你的代码如下

扩展JpaRepository

但是,第二个参数必须是用@Id注释的属性的类型,在本例中为Integer。

下一步,由于你的 pokemonId 属性是实体的标识符,你不需要创建新方法,只需使用 .findById()

最后一点,如果您需要复合标识符(即标识符多于一列),则用 @Id 注释的属性必须是一个包含将成为 PK 的列的类(在您的示例中,它必须是 EvolutionPKey 类)。

在 Evolution Pkey 类中添加 @Embeddable 注释

© www.soinside.com 2019 - 2024. All rights reserved.