Java JPA LazyInitializationException尝试创建新对象并将其添加到Arraylist时出现异常

Java JPA LazyInitializationException尝试创建新对象并将其添加到Arraylist时出现异常,java,hibernate,spring-data-jpa,Java,Hibernate,Spring Data Jpa,我有一个JavaSpringJPA应用程序,它有一个Bord实体和一个BordRow实体。一个Bord有多个bordrow。现在我尝试创建一个新的BordRow,并将其添加到Bord中的BordRow列表中。但是,我得到了一个LazyInitializationException。如何更改代码以创建新的BordRow,将其保存在数据库中并返回整个Bord对象? 参数content类似于:{title:“Test Row”,bord_id:1} 例外情况: org.hibernate.LazyIn

我有一个JavaSpringJPA应用程序,它有一个
Bord
实体和一个
BordRow
实体。一个
Bord
有多个
bordrow
。现在我尝试创建一个新的
BordRow
,并将其添加到
Bord
中的
BordRow
列表中。但是,我得到了一个LazyInitializationException。如何更改代码以创建新的
BordRow
,将其保存在数据库中并返回整个
Bord
对象? 参数
content
类似于:
{title:“Test Row”,bord_id:1}

例外情况:

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]
博德级:

@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方法:

@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;
}
@MessageMapping(“/bord_row/create”)
@发送到(“/bord_行/已创建”)
公共可选创建(字符串内容){
JSONObject对象=新的JSONObject(内容);
可选bord=bordRepository.findById(object.getInt(“bord_id”));
if(bord.isPresent())
{
BordRow行=新的BordRow(object.getString(“title”);
row.setBord(bord.get());
列表行=bord.get().getRows();
行。添加(行);
bord.get().setRows(行);
bordRepository.save(bord.get());
}
返回bord;
}
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());
        bord.get().addRow(row);
        bordRepository.save(bord.get());
    }

    return bord;
}
@MessageMapping(“/bord_row/create”)
@发送到(“/bord_行/已创建”)
公共可选创建(字符串内容){
JSONObject对象=新的JSONObject(内容);
可选bord=bordRepository.findById(object.getInt(“bord_id”));
if(bord.isPresent())
{
BordRow行=新的BordRow(object.getString(“title”);
row.setBord(bord.get());
bord.get().addRow(行);
bordRepository.save(bord.get());
}
返回bord;
}

这里您可以从数据库加载一个对象

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

带有BoardRows的列表是延迟加载的,这意味着一旦事务结束,您将使用代理。这是您得到的错误,因为您想在代理上添加一些内容

由于性能方面的原因,您可能会将延迟加载转换为不重新排序的急切加载。 你可以使用实体图。这些允许您加载更深层次的对象,即使它们是延迟加载的

我希望这有帮助

马蒂亚斯

@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());
        bord.get().addRow(row);
        bordRepository.save(bord.get());
    }

    return bord;
}