在spring-boot和jpa中使用java初始化数据库

vecaoik1  于 2023-03-16  发布在  Spring
关注(0)|答案(2)|浏览(142)

我正在使用spring-boot CommandLineRunner类使用应用程序运行所需的一些初始数据来初始化数据库。问题是commandLineRunner类在每次重新启动应用程序时运行,这会在数据库中创建重复条目(当我设置hbm2 ddl-auto =更新时)。**如何使应用程序只运行一次初始化语句,并且以后的部署不应执行初始化语句,这会导致数据重复。**我可以使用schema.sql和data.sql文件,但初始化数据需要有关系Map,我不确定如何做到这一点。命令行运行程序中的示例记录如下:

Component
@RequiredArgsConstructor
public class DataLoader
    implements CommandLineRunner {
    
     @Override
    public void run(String... args) throws Exception {
    
    Role userRole = new Role();
        userRole.setRoleName("user");
        userRole.setDescription("test user");
        roleRepository.save(userRole);
        
        
        //Users and there roles
        User user = new User();
        user.setFirstName("UserFirstName");
        user.setLastName("UserLastName");
        user.setPhoneNumber("xx-232323232323");
        user.addRoleToUser(userRole);
        userRepository.save(user);
        }}
m0rkklqb

m0rkklqb1#

你可以用roleRepository.getRoleByName("user")测试userRole是否存在,如果存在就跳过数据库填充,还有其他更复杂的方法,比如liquibase,但这是一个小练习。
建议实施:

@Component
@RequiredArgsConstructor
public class DataLoader
    implements CommandLineRunner {
    
     @Override
    public void run(String... args) throws Exception {
    if(roleRepository.getRoleByName("user").empty()) {
    Role userRole = new Role();
        userRole.setRoleName("user");
        userRole.setDescription("test user");
        roleRepository.save(userRole);
        
        
        //Users and there roles
        User user = new User();
        user.setFirstName("UserFirstName");
        user.setLastName("UserLastName");
        user.setPhoneNumber("xx-232323232323");
        user.addRoleToUser(userRole);
        userRepository.save(user);
        }
    }
}
wfsdck30

wfsdck302#

您可以在插入之前检查这些特定角色和用户是否存在。

相关问题