下面是我编写的定义实体类的代码,这些代码在编译时没有真正的问题,但在运行时确实有问题。
@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]
如果有人对如何解决这个问题有一些想法,那就太好了! 谢谢!
我尝试了其他几种书写方式,但从未成功......
接口实现错误。你的代码如下
扩展JpaRepository
但是,第二个参数必须是用@Id注释的属性的类型,在本例中为Integer。
下一步,由于你的 pokemonId 属性是实体的标识符,你不需要创建新方法,只需使用 .findById()
最后一点,如果您需要复合标识符(即标识符多于一列),则用 @Id 注释的属性必须是一个包含将成为 PK 的列的类(在您的示例中,它必须是 EvolutionPKey 类)。
在 Evolution Pkey 类中添加 @Embeddable 注释