Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在一次调用中保存父级和子级(Hibernate,JPA)_Java_Spring_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

Java 如何在一次调用中保存父级和子级(Hibernate,JPA)

Java 如何在一次调用中保存父级和子级(Hibernate,JPA),java,spring,hibernate,jpa,spring-data-jpa,Java,Spring,Hibernate,Jpa,Spring Data Jpa,我知道,这个问题已经被问了很多次,但我的情况不同(例如) 我有DTO: @数据 公共类交换稳定到{ 私有交换速率稳定类型表; 私人字符串编号; 私有LocalDate tradingDate; private LocalDate effectiveDate; 私人名单费率; } @资料 公共类交换到{ 私人字符串货币; 私有字符串码; 私人双中; 私人双标; 私人双重询问; } 和实体: @数据 @实体 @表(schema=DatabaseNames.schema\u NBP) 公营部门保持稳

我知道,这个问题已经被问了很多次,但我的情况不同(例如)

我有DTO:

@数据
公共类交换稳定到{
私有交换速率稳定类型表;
私人字符串编号;
私有LocalDate tradingDate;
private LocalDate effectiveDate;
私人名单费率;
}
@资料
公共类交换到{
私人字符串货币;
私有字符串码;
私人双中;
私人双标;
私人双重询问;
}
和实体:

@数据
@实体
@表(schema=DatabaseNames.schema\u NBP)
公营部门保持稳定{
@身份证
@GeneratedValue(generator=“UUID”)
@GenericGenerator(name=“UUID”,strategy=“org.hibernate.id.UUIDGenerator”)
私有UUID;
@枚举(EnumType.ORDINAL)
私有ExchangeStatableType表类型;
私人字符串编号;
私有LocalDate tradingDate;
private LocalDate effectiveDate;
@OneToMany(mappedBy=“exchangeRatesTable”,cascade=CascadeType.ALL,orphan=true)
私有集合交换;
}
@数据
@实体
@表(schema=DatabaseNames.schema\u NBP)
公共类汇率{
@身份证
@GeneratedValue(generator=“UUID”)
@GenericGenerator(name=“UUID”,strategy=“org.hibernate.id.UUIDGenerator”)
私有UUID;
@manytone(fetch=FetchType.LAZY,可选=false,cascade=CascadeType.ALL)
@JoinColumn(foreignKey=@foreignKey(name=“FK\U汇率表”))
私人交换稳定交换稳定;
私人字符串货币;
私有字符串码;
私人双中;
私人双标;
私人双重询问;
}
我也有两个存储库:

公共接口ExchangeRatesTableRepository扩展了JpaRepository{
}
公共接口ExchangeRepository扩展了JpaRepository{
}
在控制器中,我有以下代码:

ModelMapper ModelMapper=newmodelmapper();
ExchangeRatesTableDto table=ExchangerateService.getTable(exchangeRatesTableType);
ExchangeRatesTable ExchangeRatesTable=modelMapper.map(表,ExchangeRatesTable.class);
ExchangerateStablerRepository.save(exchangeRatesTable);
exchangeRatesService
返回
ExchangeRatesStabledTo
与childs。 ModelMapper返回:

但是
save
方法不起作用:

Hibernate: /* insert model.ExchangeRatesTable */ insert into nbp.exchange_rates_table (effective_date, no, table_type, trading_date, id) values (?, ?, ?, ?, ?)
Hibernate: /* insert model.ExchangeRate */ insert into nbp.exchange_rate (ask, bid, code, currency, exchange_rates_table_id, mid, id) values (?, ?, ?, ?, ?, ?, ?)
2021-04-14 14:27:42.889  WARN 11404 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: 23502
2021-04-14 14:27:42.889 ERROR 11404 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : ERROR: null value in column "exchange_rates_table_id" of relation "exchange_rate" violates not-null constraint
  Szczegóły: Failing row contains (f2a461e5-80ce-4837-aab9-a87919c978f8, null, null, BRL, real (Brazylia), 0.6658, null).
could not execute statement; SQL [n/a]; constraint [exchange_rates_table_id" of relation "exchange_rate]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement


您必须使用
ExchangeRatesTable
对象手动设置每个
ExchangeRatesTable
对象,就像您使用
ExchangeRatesTable
setter方法一样。然后它将不会为空,并在数据库中保存

Parent parent = new Parent();
Child child1 = new Child();
child1.setParent(parent);
parent.setChildren(Arrays.asList(child1));
jpa.save(parent);

在您的代码中,您可以迭代
ExchangeRateList
并将
ExchangeRatesTable
obj设置为所有元素。

我忘了它。我向
ExchangeRatesTable
类添加了方法:``lang java public void setExchangeRates(Set exchangeRates){exchangeRates.forEach(exchangeRate->exchangeRate.setExchangeRatesTable(this));this.exchangeRates=exchangeRates;}“``并将
@Data
替换为
@Getter
@Setter
,它就可以工作了。