尝试创建新对象并将其添加到Arraylist时,Java JPA LazyInitializationException

我有一个Java Spring JPA应用程序,它具有一个class PopupLayerViewController : UIViewController { private let alertLayer = UIView() override func viewDidLoad() { view.addSubview(alertLayer) alertLayer.translatesAutoresizingMaskintoConstraints = false alertLayer.widthAnchor.constraint(equalTo: view.widthAnchor).isactive = true alertLayer.heightAnchor.constraint(equalTo: view.heightAnchor).isactive = true alertLayer.centerXAnchor.constraint(equalTo: view.centerXAnchor).isactive = true alertLayer.centerYAnchor.constraint(equalTo: view.centerYAnchor).isactive = true } } 实体和一个Bord实体。 BordRow有多个Bord。现在,我尝试创建一个新的BordRows并将其添加到BordRow中的BordRows列表中。但是,我得到了LazyInitializationException。如何更改代码以创建新的Bord,将其保存在数据库中并返回整个BordRow对象? 参数Bord类似于:content

例外:

{title: "Test Row",bord_id: 1}

Bord类:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: Bord.rows,could not initialize proxy - no Session
    at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:606) ~[hibernate-core-5.4.6.Final.jar:5.4.6.Final]
    at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:218) ~[hibernate-core-5.4.6.Final.jar:5.4.6.Final]
    at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:585) ~[hibernate-core-5.4.6.Final.jar:5.4.6.Final]
    at org.hibernate.collection.internal.AbstractPersistentCollection.write(AbstractPersistentCollection.java:409) ~[hibernate-core-5.4.6.Final.jar:5.4.6.Final]
    at org.hibernate.collection.internal.PersistentBag.add(PersistentBag.java:383) ~[hibernate-core-5.4.6.Final.jar:5.4.6.Final]
    at WebSocketController.create(WebSocketController.java:47) ~[main/:na]
    at sun.reflect.NativeMethodaccessorImpl.invoke0(Native Method) ~[na:1.8.0_221]
    at sun.reflect.NativeMethodaccessorImpl.invoke(NativeMethodaccessorImpl.java:62) ~[na:1.8.0_221]
    at sun.reflect.DelegatingMethodaccessorImpl.invoke(DelegatingMethodaccessorImpl.java:43) ~[na:1.8.0_221]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_221]
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:171) ~[spring-messaging-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:120) ~[spring-messaging-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMatch(AbstractMethodMessageHandler.java:565) [spring-messaging-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.messaging.simp.annotation.support.SimpAnnotationmethodMessageHandler.handleMatch(SimpAnnotationmethodMessageHandler.java:511) [spring-messaging-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.messaging.simp.annotation.support.SimpAnnotationmethodMessageHandler.handleMatch(SimpAnnotationmethodMessageHandler.java:94) [spring-messaging-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessageInternal(AbstractMethodMessageHandler.java:520) [spring-messaging-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.messaging.handler.invocation.AbstractMethodMessageHandler.handleMessage(AbstractMethodMessageHandler.java:454) [spring-messaging-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.messaging.support.ExecutorSubscribableChannel$SendTask.run(ExecutorSubscribableChannel.java:144) [spring-messaging-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_221]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_221]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_221]

BordRow类:

@Table(name = "bords")
@Entity
public class Bord
{
    @Id
    @GeneratedValue
    private int id;

    @NotNull
    private String name;

    @Column
    private String icon;

    @Column
    private String background;

    @OneToMany(mappedBy = "bord",fetch = FetchType.LAZY)
    @JsonIgnore
    private List<BordRow> rows;

    public Bord()
    {
        rows = new ArrayList<>();
    }

    public void addRow(BordRow row)
    {
        this.rows.add(row);
    }

    // Getters and setters
}

WebsocketController方法:

@Entity
@Table(name = "bord_rows")
public class BordRow
{
    @Id
    @GeneratedValue
    private int id;

    @NotNull
    private String title;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "bord_id")
    @JsonIgnore
    private Bord bord;

    public BordRow(String title) {
        this.title = title;
    }

    // Getters and setters
}

WebsocketController方法其他尝试:

@MessageMapping("/bord_row/create")
@SendTo("/bord_row/created")
public Optional<Bord> create(String content) {
    JSONObject object = new JSONObject(content);
    Optional<Bord> bord = bordRepository.findById(object.getInt("bord_id"));

    if(bord.isPresent())
    {
        BordRow row = new BordRow(object.getString("title"));
        row.setBord(bord.get());
        List<BordRow> rows = bord.get().getRows();
        rows.add(row);
        bord.get().setRows(rows);
        bordRepository.save(bord.get());
    }

    return bord;
}
silei_wjq 回答:尝试创建新对象并将其添加到Arraylist时,Java JPA LazyInitializationException

在这里您从数据库中加载对象

可选的bord = bordRepository.findById(object.getInt(“ bord_id”))

BoardRows的列表是延迟加载的,这意味着在事务关闭后,您将立即使用代理。这是您收到的错误,因为您想在代理上添加一些内容。

由于性能原因,您可以将延迟加载更改为不推荐的紧急加载。 您可以使用EntityGraphs。这些允许您加载较深的对象,即使它们是延迟加载的。

我希望有帮助

Matthias

本文链接:https://www.f2er.com/3129722.html

大家都在问