【发布时间】:2019-02-26 12:11:17
【问题描述】:
我有一个基本的 SpringBoot 2.0.5.RELEASE 应用程序。使用 Spring Initializer、JPA、嵌入式 Tomcat、Thymeleaf 模板引擎,并打包为可执行的 JAR 文件。
我有这门课:
public class User implements Serializable {
@OneToMany( cascade = CascadeType.ALL,orphanRemoval = true,
fetch = FetchType.EAGER,mappedBy = "user")
@JsonIgnore
private List<Wallet> wallets = new ArrayList<Wallet>();
..
}
还有这个:
public class Wallet implements Serializable {
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "invoice_id")
@JsonIgnore
@NotNull
private Invoice invoice;
@OneToMany(mappedBy = "wallet",
cascade = CascadeType.ALL,
orphanRemoval = true, fetch = FetchType.LAZY)
@JsonIgnore
private Set<Purchase> purchases = new HashSet<>();
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "user_id" , nullable=false)
@JsonIgnore
private User user;
..
}
还有这个:
public class Purchase implements Serializable {
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "wallet_id")
@JsonIgnore
Wallet wallet;
...
}
但是我从控制器中删除了一个具有发票和购买并且属于用户的钱包,该钱包没有从数据库中删除
walletService.delete(walletService.findById(id).get());
这是服务方法:
@Transactional
public void delete(Wallet wallet) {
if (LOG.isDebugEnabled()) {
LOG.debug("deleting Wallet [ " + wallet + " ]");
}
wallet
.getPurchases()
.parallelStream()
.forEach(p -> purchaseService.delete(p));
walletRepository.delete(wallet);
}
和
@Transactional
public void delete (Purchase purchase ) {
purchaseRepository.delete (purchase);
}
在属性文件中:
spring.jpa.show-sql=true
我在控制台中看到的最后一个查询是这个:
select
purchases0_.wallet_id as wallet_i8_13_0_,
purchases0_.id as id1_13_0_,
purchases0_.id as id1_13_1_,
purchases0_.amount as amount2_13_1_,
purchases0_.wallet_id as wallet_i8_13_1_
from
t_purchase purchases0_
where
purchases0_.wallet_id=?
没有删除也没有例外!!! !
【问题讨论】:
-
1) 你有什么例外吗? 2)你能看到删除的SQL语句吗?
-
尝试使用级联以及为什么要这样做 walletService.delete(walletService.findById(id).get());,只有 walletService.findById(id) 会得到你和反对,所以我不认为你需要做get(),
-
钱包存储库从哪个 jpa 接口扩展而来?
标签: hibernate spring-mvc spring-boot spring-data-jpa spring-data