当前位置: 首页 > 知识库问答 >
问题:

OneToMany插入导致分离实体传递到持久化错误

终彬郁
2023-03-14
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

特征角色

@Entity
@Table(name = "feature_role")
public class FeatureRole {

    @Id
    @SequenceGenerator(name = "featureRoleSeq", sequenceName = "featureRoleSeq", allocationSize = 1)
    @GeneratedValue(generator = "featureRoleSeq")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "features_id", nullable = false)
    @Getter @Setter
    @JsonbTransient
    private Features features;

    @Getter @Setter
    private String role_name;

}

特征

@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`

共有1个答案

孟鹤龄
2023-03-14

根据您的映射,featurerole可以与单个feature关联(多对一)。在代码中,每次调用fr.setfeatures(fe);时,都要遍历多个特性并重写关联。

这意味着只有循环中最后的特性才具有正确的关联,因为fr只与单个元素关联。

假设一个features可以有许多featurerole,您需要决定应用哪个用例:

...
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);
}
 类似资料:
  • 我正试图实现与hibernate的许多单向关系。问题是,当我试图向数据库中添加一些值时,我遇到了以下错误: 运行时发生异常。null:InvocationTargetException:未能执行ApplicationRunner:传递给persist:dnd35cg的分离实体。模型DND类;嵌套的异常是org。冬眠PersistentObjectException:传递给persist:dnd35

  • 我有一个实体,它已经持久化,并希望将其添加到新生成的父实体(尚未持久化)。如果我尝试持久化父级,我会得到错误“分离的实体传递到持久化:model.child”。我想我必须以某种方式为孩子调用“EntityManager.merge()”,而不是“EntityManager.persisted()”。但是我没有显式调用persisted。这由“cascade=cascadetype.all”注释处理

  • 问题内容: 我已经成功用hibernate写了我的第一个主要的孩子例子。几天后,我再次使用它并升级了一些库。不知道我做了什么,但是我再也无法使它运行了。有人可以帮助我找出返回以下错误消息的代码中的错误吗: hibernate映射: 编辑: InvoiceManager.java 发票.java InvoiceItem.java 编辑: 从客户端发送的JSON对象: 编辑: 一些详细信息: 我试图通

  • 这个网站上没有一个类似的问题能够解决我的问题。 错误:org.hibernate.persistentobjectexception:传递给persist:healthcheckapi.model.checks的分离实体 示例JSON健康对象: 请注意,这两个对象的ID都是自动生成的,我认为这是问题的一部分。

  • 我用的是JPA。 在数据库中,有建筑表和房间表。它们有一个OneTo多连接。 我可以将数据添加到建筑中,但当我尝试将数据添加到房间中时,会出现错误: 我的建筑模型: 我的房间模型: 我的主应用。在这里,我获取建筑对象并将其传递到房间: 请帮忙。

  • 我使用注释将两个实体相互映射。一个实体是,第二个实体是。drivers实体已经插入了一行,该行后来会成为bookedBus实体(PK)的外部引用(FK)。下面是两个实体,setter和getter为简洁起见被跳过。 第一实体 第二实体 现在当我尝试保存到已预订的总线实体时,它会抛出以下异常 组织。springframework。刀。InvalidDataAccessApiUsageExceptio