Hibernate OneToMany insert导致分离实体传递到PERSISTER错误
我正在尝试使用hibernate panache将数据持久化到一个Hibernate OneToMany insert导致分离实体传递到PERSISTER错误,hibernate,quarkus,reactive,quarkus-panache,Hibernate,Quarkus,Reactive,Quarkus Panache,我正在尝试使用hibernate panache将数据持久化到一个OneToMany表功能和特性角色。创建了一个服务方法,该方法的输入将是列表功能ID和字符串角色名称。我想插入FeatureRole表,其中包含每个功能(来自ids)和角色名称 return Panache.withTransaction(() -> { return featuresRepository.findByIds(ids).collect().asList().onItem().trans
OneToMany
表功能和特性角色。创建了一个服务方法,该方法的输入将是列表
功能ID和字符串
角色名称。我想插入FeatureRole表,其中包含每个功能(来自ids)和角色名称
return Panache.withTransaction(() -> {
return featuresRepository.findByIds(ids).collect().asList().onItem().transform(t -> {
FeatureRole fr = new FeatureRole();
fr.setRole_name("role name");
for (Features fe: t) {
fr.setFeatures(fe);
fe.getFeatureRoles().add(fr);
}
return featureRoleRepository.persistAndFlush(fr).map(to -> fr);
}).flatMap(t -> t);
});
当我运行此命令时,发生了一个错误。表示功能插入到功能角色表未持久化。我们如何解决这个错误
Caused by: java.util.concurrent.CompletionException: org.hibernate.PersistentObjectException: detached entity passed to persist: io.github.jithset.models.Features
at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:331)
at java.base/java.util.concurrent.CompletableFuture.uniApplyNow(CompletableFuture.java:670)
at java.base/java.util.concurrent.CompletableFuture.uniApplyStage(CompletableFuture.java:658)
at java.base/java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:2094)
at java.base/java.util.concurrent.CompletableFuture.thenApply(CompletableFuture.java:143)
at org.hibernate.reactive.util.impl.CompletionStages.lambda$loop$5(CompletionStages.java:170)
at com.ibm.asyncutil.iteration.AsyncTrampoline.lambda$asyncWhile$1(AsyncTrampoline.java:209)
at com.ibm.asyncutil.iteration.AsyncTrampoline$TrampolineInternal.unroll(AsyncTrampoline.java:119)
at com.ibm.asyncutil.iteration.AsyncTrampoline$TrampolineInternal.trampoline(AsyncTrampoline.java:101)
at com.ibm.asyncutil.iteration.AsyncTrampoline$TrampolineInternal.access$200(AsyncTrampoline.java:84)
at com.ibm.asyncutil.iteration.AsyncTrampoline.asyncWhile(AsyncTrampoline.java:192)
at com.ibm.asyncutil.iteration.AsyncTrampoline.asyncWhile(AsyncTrampoline.java:209)
at org.hibernate.reactive.util.impl.CompletionStages.loop(CompletionStages.java:169)
at org.hibernate.reactive.util.impl.CompletionStages.loop(CompletionStages.java:186)
at org.hibernate.reactive.session.impl.ReactiveSessionImpl.fire(ReactiveSessionImpl.java:1076)
at org.hibernate.reactive.session.impl.ReactiveSessionImpl.firePersist(ReactiveSessionImpl.java:696)
... 67 more
角色
特征
@实体
@表(name=“features”)
@诺尔格构装师
@托斯特林
公共类功能{
@身份证
@SequenceGenerator(name=“featureSequence”,sequenceName=“featureSequence”,allocationSize=1)
@GeneratedValue(generator=“featureSequence”)
@列(name=“feature\u id”)
@Getter@Setter
公共长id;
@Getter@Setter
@不空白
@列(唯一=真)
公共字符串名称;
@独身癖(
mappedBy=“features”,
cascade=CascadeType.ALL,
删除=真,
fetch=FetchType.EAGER
)
@Getter@Setter
私有列表功能角色=新建ArrayList();
公共功能(长id、字符串名称){
this.id=id;
this.name=名称;
}
来自(行)的公共静态要素{
返回新功能(row.getLong(“功能_id”)、row.getString(“名称”);
}`在这里输入代码`
根据您的映射,一个功能角色可以与一个功能关联(多对一)。在您的代码中,您循环使用多个功能,并在每次调用时重写关联
fr.setFeatures(fe);
这意味着只有循环中最后的特征
将具有正确的关联,因为fr
仅与单个元素关联
假设一个特性
可以有许多特性角色
,您需要决定哪个用例适用:
1.一个功能角色可以有许多功能
然后是a,您必须将映射重写为类似于:
...
class FeatureRole {
...
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<Features> features;
...
public void addFeature(Features features) {
this.features.add( features );
features.getFeatureRoles().add( this );
}
2.单个功能角色
只能与一个功能关联
然后循环的逻辑需要改变。
但是我需要更多的细节来帮助你
@Entity
@Table(name = "features")
@NoArgsConstructor
@ToString
public class Features {
@Id
@SequenceGenerator(name = "featureSequence", sequenceName = "featureSequence", allocationSize = 1)
@GeneratedValue(generator = "featureSequence")
@Column(name = "feature_id")
@Getter @Setter
public Long id;
@Getter @Setter
@NotBlank
@Column(unique = true)
public String name;
@OneToMany(
mappedBy = "features",
cascade = CascadeType.ALL,
orphanRemoval = true,
fetch = FetchType.EAGER
)
@Getter @Setter
private List<FeatureRole> featureRoles =new ArrayList<>();
public Features(Long id, String name) {
this.id = id;
this.name = name;
}
public static Features from(Row row) {
return new Features(row.getLong("feature_id"), row.getString("name"));
}`enter code here`
...
class FeatureRole {
...
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<Features> features;
...
public void addFeature(Features features) {
this.features.add( features );
features.getFeatureRoles().add( this );
}
...
class Features {
...
@ManyToMany(mappedby="features")
private List<FeatureRole> featureRoles =new ArrayList<>()
...
}
for (Features fe: t) {
fr.addFeatures(fe);
}