【发布时间】:2020-07-28 06:27:56
【问题描述】:
我的用户类如下所示:
@Entity
@Table(name = "Users")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "userID")
private Integer userID;
@Column(name = "username",nullable = false, unique = true)
private String username;
@Column(name = "password")
private String password;
@Column(name = "name")
private String name;
@Column(name = "address")
private String address;
@Column(name = "email")
private String email;
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<CreditCard> creditCard;
//Constructor, Getters and Setters
CreditCard 类的外观:
@Entity
@Table(name = "CreditCards")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class CreditCard {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "cardID", nullable = false)
private Integer cardID;
@Column(name = "cardName")
private String cardName;
@Column(name = "cardNumber")
private BigInteger cardNumber;
@Column(name = "expirationDate")
private Integer expirationDate;
@Column(name = "securityCode")
private Integer securityCode;
@ManyToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "user_id", nullable = false)
@JsonIgnore
private User user;
//Constructor, Getters and Setters
信用卡资源:
@RestController
@RequestMapping("/geektext/users")
class CreditCardResource {
@Autowired
CreditCardRepository cardsRepository;
@Autowired
UserRepository userRepository;
//Displays CreditCard By Username Search
@GetMapping("/{username}/cards")
public Optional<CreditCard> getCardsByUsername(@PathVariable String username) throws NotFoundException {
if (!userRepository.findByUsername(username).isPresent()){
throw new NotFoundException("User '" + username + "' not found");
}
return cardsRepository.findById(userRepository.findByUsername(username).get().getUserID());
}
//Creates New Card for User
@PostMapping("/{userID}/cards")
public CreditCard loadCard(@PathVariable String userID, @RequestBody CreditCard creditCard) throws NotFoundException {
return userRepository.findByUsername(userID).map(user -> {creditCard.setUser(user);
return cardsRepository.save(creditCard);
}).orElseThrow(() -> new NotFoundException("User '" + userID + "' not found"));
}
}
还有一个 UserResource.java 、 UserRepository (Interface) 和 CreditCardRepository) 但这些不会影响我遇到的问题。请我如何修复获取用户在 url 上传递用户名的卡片列表。用户如何创建新的/多张信用卡而不是更新他拥有的信用卡。
【问题讨论】:
-
为什么要这样?为什么它要找到与用户具有相同 id 的信用卡?我怀疑信用卡的主键与用户的主键相同。在这里使用可选的也很糟糕(只需使用
map和orElseThrow代替ifs,基本上这是可选的错误用法)。 -
您为什么要问与昨天在stackoverflow.com/questions/63110054/… 相同的问题。上面的评论和那里的 cmets 清楚地解释了这个问题。
-
我投票结束这个问题,因为用户已经在这里提出了这个问题:stackoverflow.com/questions/63110054/…
-
可选地使用了 User 类的 Job。此外,程序的重点是获取单个用户的卡列表,为什么使用 OneToMany 和 ManyToOne,必须有一个列在用户和信用卡之间共享相同的值才能找到那些属于特定用户。
标签: spring spring-boot spring-data-jpa one-to-many many-to-one