Normalerweise sehen Sie selten "UnsupportedOperationException". Wenn Sie versehentlich ein "Hinzufügen" oder "Entfernen" für eine unveränderliche Sammlung ausführen, ist dies wahrscheinlich der Fall.
Ich bin jedoch in JPA auf "UnsupportedOperationException" gestoßen und war eine Weile süchtig danach, daher werde ich eine Notiz hinterlassen.
Ich möchte die 1: N-Entität beibehalten und dann die untergeordnete Sammlung für diese Entität löschen.
@Transactional
@Override
public void run(String... args) throws Exception {
Parent parent = new Parent(5L, "name", List.of(
new Child(new ChildId(101L, 1L), "aaa", null),
new Child(new ChildId(102L, 1L), "bbb", null)
));
em.persist(parent);
Parent parent2 = pr.getOne(5L);
System.out.println(parent == parent2); // true
List<Child> children = parent2.getChildren();
parent2.getChildren().clear();
em.persist(parent2);
}
Caused by: java.lang.UnsupportedOperationException: null
at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:71) ~[na:na]
at java.base/java.util.ImmutableCollections$AbstractImmutableCollection.clear(ImmutableCollections.java:77) ~[na:na]
at org.hibernate.collection.internal.PersistentBag.clear(PersistentBag.java:495) ~[hibernate-core-5.4.20.Final.jar:5.4.20.Final]
Mit dem obigen Code wird dieselbe Instanz für `parent``` und`
parent2 zurückgegeben. Dann gibt `` `getChildren
eine unveränderliche Sammlung von`` List.of zurück, sodass` `clear
zu
UnsupportedOperationException``` führt.
Ich habe nicht sofort bemerkt, dass dieselbe Instanz zurückgegeben wurde, da der tatsächliche Code im Persistenzkontext voneinander getrennt war. Ich dachte unwissentlich, wenn ich es in einen Persistenzkontext setze und abrufe, würde es in eine veränderbare Sammlung wie "ArrayList" umgepackt, sodass der obige Code dieselbe Instanz zurückgibt. Ich war süchtig danach, ohne es zu merken.
Recommended Posts