Java JPA LazyInitializationException尝试创建新对象并将其添加到Arraylist时出现异常
我有一个JavaSpringJPA应用程序,它有一个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
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;
}