Hibernate Many To Many nie działa

Odpowiedz Nowy wątek
2015-02-05 16:12
0

Witam. Mam problem z użyciem mapowania many to many. Otóż robię wszystko tak jak w przykładach, które znalazłem i wciąż wyskakują mi błędy. Moje klasy modelu to:

@Entity
public class Przeladunek {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="PRZELADUNEK_ID")
    private int przeladunekNumer;

    private Date planowanyCzas;
    private Date czasRealizacji;

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "ZALADUNEK_PACZKA", 
            joinColumns = {@JoinColumn(name="PRZELADUNEK_ID")}, 
            inverseJoinColumns = {@JoinColumn(name="PACZKA_ID")})
    private List<Paczka> paczkiDoZaladowania = new ArrayList<Paczka>();
@Entity
public class Paczka 
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "PACZKA_ID")
    private int paczkaNumer;

    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "zaladunki")
    /*@JoinTable(name = "ZALADUNEK_PACZKA", 
            joinColumns = {@JoinColumn(name="paczkaNumer")}, 
            inverseJoinColumns = {@JoinColumn(name="przeladunekNumer")})*/
    private List<Przeladunek> zaladunki = new ArrayList<Przeladunek>();

(tutaj próbowałem także użyć konstrukcji, ktora jest w tym momencie zakomnetowana)

A oto log:

[...]
2015-02-05 15:58:04,274 ERROR ContextLoader:319 - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [Pakowacz-core.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build EntityManagerFactory
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:532)
lut 05, 2015 3:58:04 PM org.apache.catalina.core.StandardContext startInternal
SEVERE: Error listenerStart
lut 05, 2015 3:58:04 PM org.apache.catalina.core.StandardContext startInternal
SEVERE: Context [/Pakowacz] startup failed due to previous errors
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
[...]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [Pakowacz-core.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build EntityManagerFactory
[...]
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build EntityManagerFactory
[...]
Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: com.mycompany.pakowacz.model.Przeladunek.zaladunki in com.mycompany.pakowacz.model.Paczka.zaladunki
[...]
[...]

Pozostało 580 znaków

2015-02-05 16:50
0
  1. Uzywaj Set<> a nie List<>!
  2. MappedBy wskazuje na wlasciciela po drugiej stronie a u ciebie probujesz tam podac property po tej samej stronie...

Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2015-02-05 19:15
Widzę już któryś raz, że zwracasz uwagę żeby używać Setów - ale w każdym przypadku? - Hepek 2015-02-05 21:50
Z Hibernate? W każdym :P A tak poważnie to zawsze wtedy kiedy jest to możliwe. Dla zainteresowanych: https://hibernate.atlassian.net/browse/HHH-1718 - Shalom 2015-02-05 22:07

Pozostało 580 znaków

2015-02-05 17:38
Zimny Krawiec
0

Zrobiłem to co powiedziałeś, nadal nie działa :(

Pozostało 580 znaków

2015-02-05 19:16
0

Ale jaki jest błąd? Bo przecież nie taki sam...


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-02-05 20:16
Zimny Krawiec
0

Faktycznie. Teraz pojawił się ciekawszy błąd:

[...]
Caused by: org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: com.mycompany.pakowacz.model.Paczka.zaladunki
[...]

Zmiany jakie zrobiłem w tej klasie:

@Entity
public class Paczka 
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "PACZKA_ID")
    private int paczkaNumer;

    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "paczkiDoZaladowania")
    /*@JoinTable(name = "ZALADUNEK_PACZKA", 
            joinColumns = {@JoinColumn(name="paczkaNumer")}, 
            inverseJoinColumns = {@JoinColumn(name="przeladunekNumer")})*/
    private Set<Przeladunek> zaladunki = new HashSet<Przeladunek>();

Pozostało 580 znaków

2015-02-05 20:25
0

A z drugiej strony?


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-02-05 20:58
Zimny Krawiec
0

Teraz mam jeszcze inny błąd.

Kolumna 'PRZELADUNE0_.PRZELADUNEKID' nie znajduje się w żadnej tabeli z listy FROM lub pojawia się w specyfikacji łączenia i jest poza zasięgiem tej specyfikacji, albo pojawia się w klauzuli HAVING i nie ma jej na liście GROUP BY. Jeśli jest to instrukcja CREATE lub ALTER TABLE, wtedy 'PRZELADUNE0.PRZELADUNEK_ID' nie jest kolumną w tabeli docelowej.

Jeszcze raz obie klasy:

@Entity
public class Przeladunek {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "PRZELADUNEK_ID")
    private int przeladunekNumer;

    private Date planowanyCzas;
    private Date czasRealizacji;

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "ZALADUNEK_PACZKA", 
            joinColumns = {@JoinColumn(name="PRZELADUNEK_ID")}, 
            inverseJoinColumns = {@JoinColumn(name="PACZKA_ID")})
    private Set<Paczka> paczkiDoZaladowania;
@Entity
public class Paczka 
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "PACZKA_ID")
    private int paczkaNumer;

    @ManyToMany(fetch = FetchType.LAZY, mappedBy = "paczkiDoZaladowania")
    /*@JoinTable(name = "ZALADUNEK_PACZKA", 
            joinColumns = {@JoinColumn(name="paczkaNumer")}, 
            inverseJoinColumns = {@JoinColumn(name="przeladunekNumer")})*/
    private Set<Przeladunek> zaladunki;

Pozostało 580 znaków

2015-02-05 21:43
0

A próbowałeś najpierw zdać sie na defaultową konfiguracje i wywalic to join column w ogóle? ;] Poza tym GDZIE ci teraz taki błąd wysokoczył, bo przecież nie przy starcie aplikacji...


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-02-05 22:53
Zimny Krawiec
0

Już naprawiłem problem. Prawdopodobnie chodziło o to że tabele w mojej bazie danych nie chciały być automatycznie update'owane, pomogło usunięcie ich przez co musiały być automatycznie stworzone od nowa z już poprawnymi atrybutami. Dziękuję za wsparcie :)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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