Hibernate Many To Many nie działa

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 1504,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 304 PM org.apache.catalina.core.StandardContext startInternal
SEVERE: Error listenerStart
lut 05, 2015 304 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
[...]
[...]

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...
0

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

0

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

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>();
0

A z drugiej strony?

0

Teraz mam jeszcze inny błąd.

Kolumna 'PRZELADUNE0_.PRZELADUNEK_ID' 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;
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...

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 :)

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