问题描述
我使用技术jpa,休眠,春季启动-数据,api REST.
I use the technologies jpa, hibernate, spring boot - data, api REST.
我遇到以下错误:
这是我的代码:
实体用户:
package com.wj.entities;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import com.fasterxml.jackson.annotation.JsonManagedReference;
@Entity
public class User implements Serializable{
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy="user", fetch=FetchType.LAZY)
@JsonManagedReference
private List<Wallet> wallets = new ArrayList<>();
public User() {
super();
}
public User(String name) {
super();
this.name = name;
}
public User(Long id, String name) {
super();
this.id = id;
this.name = name;
}
public User(Long id, String name, List<Wallet> wallets) {
super();
this.id = id;
this.name = name;
this.wallets = wallets;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Wallet> getWallets() {
return wallets;
}
public void setWallets(List<Wallet> wallets) {
this.wallets = wallets;
}
}
实体钱包:
@Id
@GeneratedValue
private Long id;
private String name;
@ManyToOne
@JoinColumn(name="user_id")
@JsonBackReference
private User user;
public Wallet() {
super();
}
public Wallet(String name, User user) {
super();
this.name = name;
this.user = user;
}
public Wallet(Long id, String name, User user) {
super();
this.id = id;
this.name = name;
this.user = user;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
restApi:
@RequestMapping(value="/wallets", method=RequestMethod.POST)
public Wallet save(@RequestBody Wallet wallet) {
User user = wallet.getUser();
Long id = walletRepository.createWallet(user.getId(), wallet.getName());
User boundUser = wallet.getUser();
User simpleUser = new User(boundUser.getId(), boundUser.getName());
wallet = new Wallet(id, wallet.getName(), simpleUser);
return walletRepository.save(wallet);
}
DAO:
package com.wj.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import com.wj.entities.Wallet;
public interface WalletRepository extends JpaRepository<Wallet, Long>{
Long createWallet(Long id, String name);
}
推荐答案
WalletRepository
界面中的此声明对Spring无效:
This declaration in your WalletRepository
interface is not valid for Spring :
Long createWallet(Long id, String name);
您如何希望Spring猜测createWallet()
方法的目的是创建和持久化具有Long id
和String name
的Wallet
实体?
How do you want that Spring guesses what the createWallet()
method is designed to create and persist a Wallet
entity with a Long id
and a String name
?
实际上,您在WalletRepository
接口中声明的方法是依赖命名约定的检索方法,以允许Spring为您创建查询.而且,Spring Data文档中未引用create
:
In fact the methods you declare in your WalletRepository
interface are retrieval methods that rely on naming conventions to allow Spring create the queries for you. And create
is not referenced in the Spring Data documentation :
该机制去除前缀find…By
,read…By
,query…By
, 方法中的count…By
和get…By
,并开始解析其余内容 它.
The mechanism strips the prefixes find…By
, read…By
, query…By
, count…By
, and get…By
from the method and starts parsing the rest of it.
由于Spring无法识别create
,因此它可能尝试将createWallet
解析为实体的字段.消息:
As Spring didn't recognize create
, it probably tries to resolve createWallet
as a field of the entity. Whereas the message :
要保存实体,请使用JpaRepository
中提供的方法:
To save an entity, instead use the method provided in the JpaRepository
:
<S extends T> S save(S entity);
您的存储库的哪个将推断为:
which for your repository will be inferred as :
Wallet save(Wallet entity);
并修改您的客户端代码以创建Wallet
实例并将其传递给save()
.
And adapt your client code to create the Wallet
instance and to pass it to save()
.
例如:
@RequestMapping(value="/wallets", method=RequestMethod.POST)
public Wallet save(@RequestBody Wallet wallet) {
User boundUser = wallet.getUser();
return walletRepository.save(wallet);
}
这篇关于java.lang.IllegalArgumentException:无法在JpaRepository中创建查询方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!