[JAVA] Wenn Sie eine unveränderliche Sammlung mit JPA löschen, erhalten Sie natürlich eine UnsupportedOperationException.

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

Wenn Sie eine unveränderliche Sammlung mit JPA löschen, erhalten Sie natürlich eine UnsupportedOperationException.
Wenn Sie es leid sind, ER-Diagramme zu zeichnen
[Schienen] Was tun, wenn mit der Fehlermethode keine Fehlermeldung angezeigt wird?
Was tun, wenn Sie sich über OpenSSL mit pyenv install ärgern?
[Rails] Was tun, wenn Sie mit form_with keine Parameter abrufen können?
Was tun, wenn Sie gem'bcrypt 'in Ihre Gemfile eingeben und bei der Bundle-Installation eine Fehlermeldung erhalten?