Java 如何在一次调用中保存父级和子级(Hibernate,JPA)
我知道,这个问题已经被问了很多次,但我的情况不同(例如) 我有DTO: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) 公营部门保持稳
@数据
公共类交换稳定到{
私有交换速率稳定类型表;
私人字符串编号;
私有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
,它就可以工作了。