Delete na undirectional @OneToOne

0
class Parent {

    @Id
    Long id;

}

.

class Child {
    
    @Id
    Long id;

    @OneToOne
    Parent parent;

}

W takim przypadku, gdy zechcę usunąć Parent JPA się oburzy, że ConstraintViolationException, bo usuwam encję, bez usunięcia do niej referencji z innej encji. Powinienem najpierw usunąć refencję do Parent z Child.

Wyszukałem rozwiązania dla biderectional associantions albo dla @manyToOne ale nie znalazłem nic dla @OneToOne undirectional. Czy muszę zrobić z tego biderectional jeśli nie chcę kaszany?

EDIT:

próbowałem tak i też nie działa:

class Parent {
 
    @Id
    Long id;

    @OneToOne(cascade=CascadeType.REMOVE, mappedBy = "parent")
    @OnDelete(action = OnDeleteAction.CASCADE)
    Child child;
 
}

.

class Child {
 
    @Id
    Long id;
 
    @OneToOne
    Parent parent;
 
}
0

Zrobiłem coś takiego:

class Parent {
 
    @Id
    Long id;
 
    @OneToOne(mappedBy = "parent")
    Child child;
 
}

.

class Child {
 
    @Id
    Long id;
 
    @OneToOne(cascade={CascadeType.REMOVE, CascadeType.REFRESH, CascadeType.PERSIST})
    Parent parent;
 
}

i teraz nie wyrzuca żadnego błędu tylko nie robi po prostu nic. ;/

krew mnie zalewa z tym jpa, największe g**no jakie powstało. Skończę ten projekt i rzucam to w cholerę.

0

a próbowałeś z tym orphanRemoval = true ?

0
Pinek napisał(a):

a próbowałeś z tym orphanRemoval = true ?

tak. Pinek to jest chyba grubsza sprawa...
jak robię na Vehicle -> Driver to @OnDelete(action = OnDeleteAction.CASCADE) to zaczyna się burzyć o Route -> Vehicle, jak tam dorzucam @OnDelete(action = OnDeleteAction.CASCADE) to się burzy o Order -> Route, jak tam dorzucam @OnDelete(action = OnDeleteAction.CASCADE) to się burzy o Order -> Client i tutaj @OnDelete(action = OnDeleteAction.CASCADE) już nie pomaga... Pewnie dlatego, że Order -> Client jest mapowany w osobnej tabeli i na tej tabeli pewnie trzeba zrobić to cascadowanie, a dodajac to w encji robię to tylko na Client i Order

    class Order {
// ...
	@ManyToMany
	@JoinTable(name="ORDER_CLIENT", joinColumns=@JoinColumn(name="order_id"), 
	inverseJoinColumns=@JoinColumn(name="client_id"))
	@OnDelete(action = OnDeleteAction.CASCADE)
	private Set<Client> clients = new HashSet<>();
// ...
    }

.

    class Client {
// ...
    	@ManyToMany(fetch = FetchType.LAZY, mappedBy = "clients")
	@OnDelete(action = OnDeleteAction.CASCADE)
	Set<Order> orders = new HashSet<>();
// ...
    }

tabele wyglądają tak:
title
title
title

0

Zrobiłem na nowo najprostszy na świecie projekt i wygląda na to, że trzeba zrobić bidirectional i zamapować odwrotnie właściciela klucza.

title

0

Jeszcze inaczej... musiałęm dodać:

	@PreRemove
	private void preRemove() {
	    child.setParent(null);
	}

całe rozwiązanie:

class Parent {
 
    @Id
    Long id;

    @OneToOne(mappedBy="parent")
     Child child;

    @PreRemove
    public void preRemove() {
        child.setParent(null);
    }

    // getteroza i setteroza...
 
}

.

class Child {
 
    @Id
    Long id;
 
    @OneToOne
    Parent parent;
 
    // getteroza i setteroza...
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1