gpt4 book ai didi

java - 如何在Spring中使用CommandLineRunner测试JPA实体?

转载 作者:行者123 更新时间:2023-12-01 19:12:36 30 4
gpt4 key购买 nike

我有两(两)个实体帐户和社交服务。帐户可以有 1(一)个服务(逻辑上),但 SocialService 可以有许多帐户。所以我有帐户类:

   @Entity
@Table(name = "accounts")
@Data
public class Account {

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

@Column(name = "email")
private String email;

@Column(name = "password")
private String password;

@ManyToOne(cascade = CascadeType.ALL)
// @JoinColumn(name = "social_service_id", referencedColumnName = "id")
private SocialService socialService;

@Column(name = "service_link")
private String serviceLink;


@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Account account = (Account) o;
return id.equals(account.id) &&
email.equals(account.email) &&
password.equals(account.password) &&
socialService.equals(account.socialService);
}

@Override
public int hashCode() {
return Objects.hash(id, email, password, socialService);
}
}

和 SocialService 类

   @Entity
@Table(name = "social_services")
@Data
public class SocialService {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@Column(name = "official_link")
private String officialLink;

@OneToMany
@JoinTable(
name = "accounts_social_service",
joinColumns = @JoinColumn(name = "social_service_id"),
inverseJoinColumns = @JoinColumn(name = "account_id")
)
private List<Account> accounts;

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SocialService that = (SocialService) o;
return Objects.equals(id, that.id) &&
Objects.equals(name, that.name) &&
Objects.equals(officialLink, that.officialLink);
}

@Override
public int hashCode() {
return Objects.hash(id, name, officialLink);
}
}

我尝试使用 CommandLineRunner 对其进行测试:

       @Component
public class DatabaseLoader implements CommandLineRunner {
private final SocialServiceRepository socialServiceRepository;
private final AccountRepository accountRepository;

public DatabaseLoader(SocialServiceRepository socialServiceRepository, AccountRepository accountRepository) {
this.socialServiceRepository = socialServiceRepository;
this.accountRepository = accountRepository;
}

@Override
public void run(String... args) throws Exception {
Account account1 = new Account();
Account account2 = new Account();
List<Account> accountList = new ArrayList<>();

account1.setId(1L);
account1.setEmail("1@gmail.com");
account1.setPassword("123");
account1.setServiceLink("https://stackoverflow.com");

account2.setId(2L);
account2.setEmail("2@gmail.com");
account2.setPassword("345");
account2.setServiceLink("https://stackoverflow.com");

SocialService socialService = new SocialService();
account1.setSocialService(socialService);
account2.setSocialService(socialService);

socialService.setId(1L);
socialService.setName("stackoverflow");
socialService.setOfficialLink("https://stackoverflow.com");

accountList.add(account1);
accountList.add(account2);
socialService.setAccounts(accountList);

accountRepository.save(account1);
accountRepository.save(account2);
socialServiceRepository.save(socialService);
}
}

但是我得到了空表account_social_serviceerror: 在实体类中哪里?还是硬编码?

更新:添加完整代码

最佳答案

您没有将您的帐户添加到 accountList。另外,在帐户中使用ManyToOne。当您使用 JoinTable 时,请勿在 Account 中使用 JoinColumn。

所以你将拥有:

@ManyToOne(cascade = CascadeType.ALL) private SocialService socialService;

@OneToMany @JoinTable( name = "accounts_social_service", joinColumns = @JoinColumn(name = "social_service_id"), inverseJoinColumns = @JoinColumn(name = "account_id") ) private List<Account> accounts;

Account account1 = new Account();
Account account2 = new Account();
account1.setId(1L);
account1.setEmail("1@gmail.com");
account1.setPassword("123");
account1.setServiceLink("https://stackoverflow.com");
account2.setId(2L);
account2.setEmail("2@gmail.com");
account2.setPassword("345");
account2.setServiceLink("https://stackoverflow.com");
SocialService socialService = new SocialService();
account1.setSocialService(socialService);
account2.setSocialService(socialService);
socialService.setId(1L);
socialService.setName("stackoverflow");
socialService.setOfficialLink("https://stackoverflow.com");
List<Account> accountList = new ArrayList<>();
accountList.add(account1);
accountList.add(account2);
socialService.setAccounts(accountList);
accountRepository.save(account1);
accountRepository.save(account2);
socialServiceRepository.save(socialService);

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

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