如何解决如何使用springboot将示例数据添加到数据库?
我有一个Spring Boot应用程序,其中有Spring Data JPA和两个映射到数据库的实体。我的应用程序设置为在每次启动时重新创建数据库。现在,我想创建这些POJO的一些实例,并将其保存在数据库中,以便在进行中的开发过程中获得一些数据来测试我的应用程序。
最好的方法是什么?
到目前为止我尝试过的是: 我上课添加示例数据
public class DBSampleAdditor {
@PersistenceContext
private EntityManager em;
@Transactional
public void addSampleData() {
// creating POJO instances and persist them with em.perists()
}
}
我试图在ApplicationClass的主类中调用这些函数
@SpringBootApplication()
public class ApiApplication {
public static void main(String[] args) {
SpringApplication.run(ApiApplication.class,args);
DBSampleAdditor dbsa = new DBSampleAdditor();
dbsa.addSampleData();
}
}
这根本没有用,因为EntityManager从未从持久性单元获取实例。
我还尝试创建CommandLineRunner:
@Component
public class PTCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("Adding sample data...");
DBSampleAdditor dbsa = new DBSampleAdditor();
dbsa.addSampleData();
}
}
但是在启动过程中似乎从未调用过它。
解决方法
为了使用EntityManager
之类的弹簧管理组件,对象需要弹簧Beans
,这基本上意味着它们是在spring上下文内部创建的,并且可以利用IoC容器。
在上面的示例中,从main方法运行DbSampleAdditor
类是在spring上下文之外,因此像PersistenceContext
这样的bean不会被注入。
在spring上下文中执行此操作的一种相当简单的方法是为ApplicationListener
添加ApplicationReadyEvent
@Component
class Initialise implements ApplicationListener<ApplicationReadyEvent> {
@Autowired
private final DbSampleAdditor db;
@Override
public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {
db.addSampleData();
}
}
当应用程序就绪事件触发时,所有必需的spring bean接线都已设置,因此当它运行addSampleData
方法时,像EM之类的事情就很好了。
尝试创建对象DBSampleAdditor,而不是创建对象DBSampleAdditor,以使其在应用程序启动时可用。 @Autowired DBSampleAdditor DBSampleAdditor然后尝试在run方法中添加示例数据
,您可以将@PostConstruct的方法与@Component一起使用,以在启动时插入数据。
@PostConstruct将在创建bean,注入依赖项,设置所有托管属性之后以及将bean实际设置为作用域之前调用。
只需将您的数据库存储库注入标有@Component的类中,并在标有@PostConstruct的方法内调用注入的数据库存储库
示例:
@Component
public class DbInit {
@Autowired
private UserRepository userRepository;
@PostConstruct
private void postConstruct() {
User admin = new User("admin","admin password");
User normalUser = new User("user","user password");
userRepository.save(admin,normalUser);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。