如何解决如何使用集合为表创建插入语句
我有一个 Spring boot JPA 项目,它有一个实体 Entitya。这个实体有一个集合属性
@ElementCollection(targetClass=String.class)
private List<String> options = new ArrayList<String>(10);
使用获取/设置
我看到创建的表 - Entitya 和 Entitya_options [看起来 entitya 对 Entitya_options 一无所知。但是 entitya_options 有 Entitya 的外键] 我不需要额外的桌子,但没关系
我想用import.sql插入数据,怎么办?
Insert into "ENTITYA" (FORMULA,NOTE,ACTION_ID) values (....);
插入Entitya时如何也插入Entitya_options?
编辑
问题: 我应该使用以下注释吗?如前所述 - How to persist a property of type List<String> in JPA?
@ElementCollection // 1
@CollectionTable(name = "my_list",joinColumns = @JoinColumn(name = "id")) // 2
@Column(name = "list") // 3
private List<String> list;
我需要完整的插入语句,可以放在import.sql中
解决方法
您可以使用 import.sql
(Hibernate 支持)或 data.sql
(Spring JDBC 支持)文件来加载数据。
如果您使用 JPA
和 embedded datasource
,您的 schema.sql
将不会生效,因为 Hibernate 的 DDL 生成优先于它。
该问题的解决方案是设置以下属性:
spring.jpa.hibernate.ddl-auto=none
从 Spring boot 2 开始,模式仅默认为嵌入式数据源初始化。要允许为所有类型的数据源加载数据,您必须设置以下属性:
spring.datasource.initialization-mode=always
spring.datasource.data=classpath:my_script1.sql,classpath:my_script2.sql
更新
@Component
public class MyEntityInitializer implements CommandLineRunner{
@Autowired
EntityaRepository entityaRepository;
@Override
public void run(String... args) {
Entitya entitya = new Entitya();
entitya.setOptions(Arrays.asList("op1","op2"));
entityaRepository.save(entitya);
}
}
这样您就可以在每次启动应用程序时插入您的条目。 一定要检查已经存在的记录,否则你会得到主键异常。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。