gpt4 book ai didi

java - 如何在 Spring Boot 中使用 CommandLineRunner?

转载 作者:行者123 更新时间:2023-12-02 09:22:34 29 4
gpt4 key购买 nike

我尝试通过CommandLineRunner接口(interface)将数据设置到数据库。

如果我删除有关银行实例的所有内容并使用空银行列表保存帐户,它会将数据保存到数据库中。

带有 CommandLineRunner 的 Bean 类:

@Override
public void run(String... args) throws Exception {
List<Bank> banks = new ArrayList<>();
Bank bank = new Bank("Приват Банк", 5000.0f);
Bank bank2 = new Bank("UkrsibBank", 3000.1f);
banks.add(bank);
banks.add(bank2);
bankAccountRepository.save(bank);
bankAccountRepository.save(bank2);
Account account = new Account(15000.2f, 1200.5f, banks);
accountRepository.save(account);
}

我的实体:

@Entity
@Data
@NoArgsConstructor
public class Account {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@Column(name = "total_balance")
private float totalBalance;

private float cash;

@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "account_banks", joinColumns = @JoinColumn(name = "account_id"),
inverseJoinColumns = @JoinColumn(name = "bank_id") )
private List<Bank> banks;

public Account(float totalBalance, float cash, List<Bank> banks) {
this.totalBalance = totalBalance;
this.cash = cash;
this.banks = banks;
}
}
@Entity
@Data
@NoArgsConstructor
public class Bank implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

private String name;
@Column(name = "account_balance")
private float balance;

public Bank(String name, float balance) {
this.name = name;
this.balance = balance;
}
}

我的错误是什么?堆栈跟踪:

java.lang.IllegalStateException: Failed to execute CommandLineRunner
Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist:
Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist:

最佳答案

您将此关系的级联类型设置为 cascade = CascadeType.ALL当您调用accountRepository.save(account)时Hibernate 尝试保留其相关实体(Bank),但在此之前,您还手动保存了它们(之后它们处于分离状态)。这会导致错误。我认为有以下三种可能的解决方案:

  • 如果您想独立保留实体,请完全删除级联策略。
  • 坚持Bank实体传递地与 Account
Bank bank = new Bank("Приват Банк", 5000.0f);
Bank bank2 = new Bank("UkrsibBank", 3000.1f);
banks.add(bank);
banks.add(bank2);
Account account = new Account(15000.2f, 1200.5f, banks);
accountRepository.save(account);
  • 装饰方法run@Transactional注解以保证您的实体处于持久状态

关于java - 如何在 Spring Boot 中使用 CommandLineRunner?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58582894/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com