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", [email protected](name="order_id"), 
    [email protected](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, botów: 0