OneToMany/ ManyToOne - usuwanie - Hibernate

0

Witam. W aplikacji mam kilka klas encji. dwie z nich polaczylem OneToMany/ ManyToOne. wyglada to mniejwiecje tak:
Club:

@OneToMany(mappedBy = "playersClub",
        orphanRemoval = true
)
@Cascade({CascadeType.ALL})
@ContainedIn
private Set<Player> players;

oraz Player:
..

    @ManyToOne
//        (
//            fetch = FetchType.EAGER
//    )
    @Cascade({org.hibernate.annotations.CascadeType.ALL})
    @IndexedEmbedded(depth = 1)
    private Club playersClub;

Chciałbym aby po usunięciu silniejszej encji(tutaj Club) usuwały sie rownież slabsze encje(Players). probowałem roznych kombinacji z adnotacja @OnDelete, orphanDelete, cascade z Hibernate i JPA i chyba sie pogubiłem, bo niestety nic nie działa, czy ktoś mógłby mnie naprowadzić na poprawny tor?

0

A gdzie w ogóle masz ustawione klucze obce?

0

no klucze obce znajdują sie w tabeli players

0

Ale nie chodzi o tabele bazodanowe tylko o mapowanie w ORM

0

wybacz ale chyba nie rozumiem?
Relacja odpowiada na za zmapowanie kluczy obcych

0

Chodzi o JoinColumn. Skąd ma hibernate wiedziec że to jest klucz obcy jak mu nie powiesz?

0

jest to automatycznie dodawane na zasadzie nazwapola_id. a za samo mapowanie odpowiada mappedBy.

0

Jeszcze nie widziałem żeby było mapowanie takie bez @JoinColumn
Niech się @Shalom albo @Koziołek wypowiedzą :)

0

dodanie JoinColumn nic nie zmienia. te same bledy.

 Cannot delete or update a parent row: a foreign key constraint fails (`portalstat`.`player`, CONSTRAINT `FK8EA38701C3272131` FOREIGN KEY (`id_klubu`) REFERENCES `club` (`id`))
1
  1. Nie mieszaj typow z JPA z tymi z Hibernate! One sie moga nazywac tak samo, ale nie beda razem dzialac!
  2. CascadeType.ALL z JPA po stronie one powinno zalatwic sprawe o ile dobrze rozumiem co robisz.
0

Masz jakiś DDL do tej bazy danych? :)
Edit a no właśnie, może mieszasz adnotacje JPA i Hibernate

0

no wlasnie w tym rzecz, ze to nie dziala:
Club:

    @OneToMany(mappedBy = "playersClub"
            ,cascade = javax.persistence.CascadeType.ALL
    )
    private Set<Player> players;

Player:

    @ManyToOne
    private Club playersClub;
0

Masz ten błąd SQLowy?

0

tak, wyskakuje gdy chce usunać Club ktory posiada Playera.

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`portalstat`.`player`, CONSTRAINT `FK8EA38701D5EDDE20` FOREIGN KEY (`playersClub_id`) REFERENCES `club` (`id`))
0

aa no ale ty to robisz odwrotnie zupelnie. Jesli robisz mappedBy = "playersClub" to wlascicielem tego powiazania jest playersClub!
http://stackoverflow.com/questions/7197181/jpa-unidirectional-many-to-one-and-cascading-delete

0

Taki przykładzik znalazłem w sieci, trochę rozdmuchana konfiguracja ale może pomoże w tym wypadku.

Parent
.......
@OneToMany (mappedBy = "parent", orphanRemoval = true, cascade={CascadeType.ALL}, targetEntity = Children.class)
private List <Children> children;
.........

Children
......
@ManyToOne(targetEntity = Parent.class, cascade = CascadeType.ALL)
@JoinColumn(name = "parent_id")
private Parent parent;

0

@up z tym nie ma błędu ale tutaj chodzi o to, że w obu relacjach jest cascadeType.all. teraz wyglada to u mnie tak:
Club:

    @OneToMany(mappedBy = "playersClub"
            ,orphanRemoval = true
            ,cascade = javax.persistence.CascadeType.ALL
//            ,targetEntity = Player.class
    )
    private Set<Player> players;

Player:

    @ManyToOne(
//            targetEntity = Club.class,
            cascade = CascadeType.ALL)
    @JoinColumn(name = "id_klubu")
    private Club playersClub;

I gdy wciskam przycisk usun Club strona sie odswieza i nic z tego nie przychodzi. Wcisniecie przycisku gdy nie ma player's powoduje poprawne usuniecie.

@Shalom
nie bardzo rozumiem co masz na myśli? zawsze w mappedBy dawalem to co jest po drugiej stronie relacji

0

Nie no to źle, tak nie powinno być że w obu relacjach jest Cascade.ALL
Powinna być tylko po stronie rodzica jak już :)

0

no to pisalem juz, ze jak nie ma cascadeType.ALL w obu stronach to jest blad "Cannot delete or update a parent row: a foreign key constraint fails"

hmm.. moze rozwine problem, bo wlasnie zdalem sobie sprawę, że wina nie leży po stronie relacji, ani DB.
Otoz aplikacja pisana jest w JSF2. Gdy Dodam klub i zawodników do niego i chce usunąć dany klub mam w/w blad. jesli są cascadeType.ALL po obu stronach - nic sie nie dzieje.
Natomiast gdy wylacze server i wlacze aplikację ponownie to mogę usunąć ten klub a wraz z nim usuwają się zawodnicy - czyli działa. kwestia pewnie w Hibernate - uzywam entityManagera, ale nigdzie go nie zamykam. To jest funkcja zapisująca encję w DB.

    public void createPlayer(Player player) {
        entityManager.getTransaction().begin();
        entityManager.persist(player);
        entityManager.getTransaction().commit();
    }

podobnie klub.

powinienem za kazdym razem tworzyc nowy entityManager i go zamykac?

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