gpt4 book ai didi

Java Spring Boot - 如何像在 PHP Laravel 中一样为数据库播种

转载 作者:行者123 更新时间:2023-12-05 04:44:46 26 4
gpt4 key购买 nike

我正在尝试学习 Java Spring Boot。我来自 PHP Laravel,我对框架怀念的一件事是制作数据库播种机和工厂等是多么容易。我试图找出一种方法,我可以播种我的 h2 db,以便每次应用程序进行热重载,它将创建一些数据用于测试。到目前为止,在 SpringBootApplication 文件中我有这个

    @Bean
CommandLineRunner commandLineRunner(){
return args -> {
Faker faker = new Faker(new Locale("en-US"));
Employee emp1 = new Employee(faker.name().firstName(), faker.name().lastName(), faker.internet().safeEmailAddress());
Employee emp2 = new Employee(faker.name().firstName(), faker.name().lastName(), faker.internet().safeEmailAddress());
Employee emp3 = new Employee(faker.name().firstName(), faker.name().lastName(), faker.internet().safeEmailAddress());
Employee emp4 = new Employee(faker.name().firstName(), faker.name().lastName(), faker.internet().safeEmailAddress());
Employee emp5 = new Employee(faker.name().firstName(), faker.name().lastName(), faker.internet().safeEmailAddress());
Project proj1 = new Project(faker.app().name(), faker.app().version() ,faker.lorem().sentence());
Project proj2 = new Project(faker.app().name(), faker.app().version() ,faker.lorem().sentence());
Project proj3 = new Project(faker.app().name(), faker.app().version() ,faker.lorem().sentence());

proj1.addEmployee(emp1);
proj2.addEmployee(emp2);
proj3.addEmployee(emp4);
proj3.addEmployee(emp3);
proj3.addEmployee(emp1);
proj3.addEmployee(emp4);
proj3.addEmployee(emp5);

emp1.setProjects(Arrays.asList(proj1, proj2, proj3));
emp2.setProjects(Arrays.asList(proj1));
emp3.setProjects(Arrays.asList(proj2));
emp4.setProjects(Arrays.asList(proj3));
emp5.setProjects(Arrays.asList(proj3));
employeeRepository.save(emp1);
employeeRepository.save(emp2);
employeeRepository.save(emp3);
employeeRepository.save(emp4);
employeeRepository.save(emp5);
projectRepository.save(proj1);
projectRepository.save(proj2);
projectRepository.save(proj3);
};
}

如您所见,它都是硬编码的,但我想知道是否有更好的方法来做到这一点。

例如我想到了这样的事情:

    @Bean
CommandLineRunner commandLineRunner(){
return args -> {
int min = 0, max = 1000, rand = 0;
Faker faker = new Faker(new Locale("en-US"));
Employee[] emp = new Employee[max];
Project[] proj = new Project[max];
// Employee and Project are entities and I wanted to be able to iterate and
// have the object get incremented so it would be like emp1, emp2, emp3 etc.
for(int i = 0; i < max; i++)
{
emp[i] = new Employee(faker.name().firstName(), faker.name().lastName(), faker.internet().safeEmailAddress());
proj[i] = new Project(faker.app().name(), faker.app().version() ,faker.lorem().sentence());
}
Random random = new Random();
// here I'm trying to randomly pick from a range of numbers of the previous
// created objects just to make it seem more organic
for(int j = 0; j < max; j++)
{
rand = random.nextInt((max - min) + 1) + min;
proj[j].setEmployees(Arrays.asList(emp[rand]));
emp[j].setProjects(Arrays.asList(proj[rand]));
employeeRepository.save(emp[rand]);
projectRepository.save(proj[rand]);
}
};

以上并没有真正奏效。我想知道是否有人知道更好的解决方案。我什至不确定这是否是我应该播种数据库的地方,或者在架构/设计方面是否有更好的选择。例如,如果我需要使用用户在应用程序中可能具有的不同角色来为我的数据库提供种子,该怎么办。

例如,在 Laravel 中,我可以做这样的事情作为一个连接表(希望这能更多地说明这一点):

foreach($projects as $project)
foreach($employees as $employee)
Project_Employee::create([
'created_at' => Carbon::now(),
'updated_at' => Carbon::now(),
'employee_id' => $employee->id,
'project_id' => $project->id,
]);

感谢任何帮助,谢谢。

编辑:我终于得到了一些工作,但我有另一个问题,它创建空行并且总是在同一个位置,我不确定为什么。两个 map 都没有任何空数据。我不确定我在这里做错了什么,谢谢你的帮助。

这是我的代码:

    @Bean
CommandLineRunner commandLineRunner(){
return args -> {
int min = 0, max = 10, rand = 0;
Faker faker = new Faker(new Locale("en-US"));
HashMap<Integer, Employee> mapEmployees = new HashMap<>();
HashMap<Integer, Project> mapProjects = new HashMap<>();
Random random = new Random();
Employee employee = new Employee();
Project project = new Project();

for(int i = 0; i < max; i++)
{
mapEmployees.put(i, new Employee(faker.name().firstName(), faker.name().lastName(), faker.internet().safeEmailAddress()));
mapProjects.put(i, new Project(faker.app().name(), faker.app().version() ,faker.lorem().sentence()));
}
for(int j = 0; j < max; j++)
{
rand = random.nextInt((max - min)) + min;
project.setEmployees(Collections.singletonList(mapEmployees.get(rand)));
employee.setProjects(Collections.singletonList(mapProjects.get(rand)));
employeeRepository.save(employee);
projectRepository.save(project);
}
};

另一个奇怪的事情是有时行数会关闭。每次应该是 10 行,但由于某些原因它可以关闭 1

enter image description here

上述结果中有 9 行。

enter image description here

上述结果中有 10 行。

最佳答案

根据 documentation , Spring Boot 允许您创建数据库模式并在引导时简单地使用两个文件填充它:schema.sql 和 data.sql。这些文件需要位于根类路径中,您可以使用标准 sql 来执行您需要的每个 DDL 或 DML 操作。

例如,我通常在运行单元测试之前使用data.sql 来初始化内存DB 中的H2。这样,我就知道在测试我的存储库时会发生什么。同样的方法也可以用来做你需要的事情

关于Java Spring Boot - 如何像在 PHP Laravel 中一样为数据库播种,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69279535/

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