Wczytywanie danych z bazy

Odpowiedz Nowy wątek
2016-01-22 16:37
0

Mam problem z wypisanie wartości z bazy na stronie. Mianowicie mam dwie Encje będące w jednostronnej relacji jeden do wielu:


@Table(name="Produkt")
public class Produkt implements Serializable {

    @Id
    @GeneratedValue
    private int idProdukt;
    private String status;
    private String nazwa;
    }

@Entity
@Table(name="Producent")
public class Producent {

    @Id
    private int idProducent;
    private String nazwa;
    private String typ;
    @OneToMany
    private List <Produkt> produkty;

i teraz żeby na stronie wypisać dane produktu to z modelu wywowułe je w ten sposób:

${product.nazwa}

. Oczywiście wcześniej za pomocą findAll() wczytuje je wszystkie z bazy.
Teraz mój problem: jak wczytać dane producenta na stronie odpowiadające danemu produktowi?

Pozostało 580 znaków

2016-01-22 16:43
0

A jak byś to zrobił gdyby w ogóle nie chodziło o zadną bazę danych? o_O Dodaj w klasie Produkt @ManyToOne z producentem?


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
Bym napisał metodę, która zwracałaby mi nazwę producenta na podstawie idProducenta. - marek527 2016-01-22 16:46
Od kiedy ty w klasach masz jakieś ID? I skąd ta metoda by to zwracała? Mam wrażenie że robiłeś coś kiedyś z bazami danych i teraz masz klapki na oczach i nie rozumiesz że ORMa uzywa sie zupełnie inaczej. Jeśli z klasy Produkt chcesz mieć odwołanie do Producenta to dodajesz po prostu referencje do niego. - Shalom 2016-01-22 16:49

Pozostało 580 znaków

2016-01-22 17:01
0

Mam zmienną o nazwie produkt w modelu, to jak mam zwrócić np nazwę producenta? Dodałem w klasie Produkt @ManyToOne z producentem.
To nie działa:
${produkt.value.producent.nazwa}

edytowany 3x, ostatnio: marek527, 2016-01-22 17:11

Pozostało 580 znaków

2016-01-22 17:14
0

Zdefiniuj "nie działa". Na pewno działa tylko pewnie ty tego producenta nigdzie nie ustawiasz i w twoich obiektach jest po prostu nullem ;]


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
Nie potrafię tego poprawnie wywołać. - marek527 2016-01-22 17:30

Pozostało 580 znaków

2016-01-22 17:29
0

Mam taki błąd:

javax.el.PropertyNotFoundException: Property 'producent' not found on type com.packt.webstore.domain.Produkt

Takie encje:


@Entity
@Table(name="Producent")
public class Producent {

    @Id
    @GeneratedValue
    private int idProducent;
    private String nazwa;
    private String typ;
    @OneToMany
    private List <Produkt> produkty;

oraz


@Entity
@Table(name="Produkt")
public class Produkt implements Serializable {
    @Id
    @GeneratedValue
    private int idProdukt;
    private String status;
    private String nazwa;
    @ManyToOne
    private Producent producent;

Na stronie wywołuje sobie poszczególne wartości pól w ten sposób:


${product.opis}

Jak mam wywołać nazwę producenta, gdyż przy takim wywołaniu ${product.producent.nazwa} lub ${product.value.producent.nazwa} mam powyżej podany błąd.

edytowany 1x, ostatnio: marek527, 2016-01-22 17:34

Pozostało 580 znaków

2016-01-22 17:51
0

A masz gettery do tego pola?


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
Ok juz poradziłem sobie. - marek527 2016-01-22 17:53

Pozostało 580 znaków

2016-01-22 18:44
0

Takie cudo mam przy relacji wiele do wielu


org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.packt.webstore.domain.Produkt.kategorie, no session or session was closed

@Entity
public class Kategoria {
    @Id
    @GeneratedValue
    private int idKategoria;
    private String nazwa;
    @ManyToMany
    private Set <Produkt> produkty;
}

@Entity
@Table(name="Produkt")
public class Produkt {

    @Id
    @GeneratedValue
    private int idProdukt;
    private String status;
    private String nazwa;
@ManyToMany(mappedBy= "produkty")
    private Set <Kategoria> kategorie;
}

.jsp


<c:forEach items="${product.kategorie}" var="kategoria">
                            <p>Kategoria: ${kategoria.nazwa}</p>
                            </c:forEach>

Co tu zmienić?

edytowany 1x, ostatnio: marek527, 2016-01-22 18:58

Pozostało 580 znaków

2016-01-22 19:17
0

Doczytać? ;] Kolekcje dopięte do encji mogą być dołączane na 2 sposoby:

  1. Eager (@ManyToOne(fetch=FetchType.EAGER)) - pobierając daną encje pobierasz wszystko co jest do niej dopięte. To jest dość ryzykowna zabawa bo moze sie okazać że pobierając z bazy jeden obiekt wyciągniesz pół bazy ;) Bo dołączasz sobie np. do produktu producenta, a producent ma listę wszystkich produktów, produkt ma kategorie itd
  2. Lazy, zachowanie domyślne, (@ManyToOne(fetch=FetchType.LAZY)) - pobierasz tylko daną encje a wszystkie dołączone do niej obiekty są niezainicjalizowane. Jeśli spróbujesz sie do nich odwołać to JPA spróbuje je "dociągnąć" o ile aktywna jest sesja z bazą danych. Niemniej poleganie na tym "dociaganiu" to proszenie sie o guza bo dociągnięcie kolekcji po której iterujesz odbywa się jedna po drugiej. Jak jest ich milion to wykonasz milion zapytań :D Zresztą sesja zamknie się po przekroczeniu granicy @transactional najpewniej więc w widoku nie będzie już aktywna (i dobrze!).
    Poprawny sposób pracy z kolekcjami Lazy to użycie join fetch. Nie wiem jak wykonujesz zapytania (czy JPQL czy Criteria czy cos innego) więc musisz sprawdzić sobie jak użyć tego mechanizmu w swoim przypadku.

Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 3x, ostatnio: Shalom, 2016-01-22 19:18

Pozostało 580 znaków

2016-01-22 20:38
0

Ok ustawiając to: (@ManyToOne(fetch=FetchType.EAGER)) błąd znika, jednak wygląda na to że zawartość jest nullem , dlaczego? W bazie mam przypisane przecież dane do tego?

Pozostało 580 znaków

2016-01-22 20:43
0

No u ciebie w kodzie było @ManyToMany jeśli w ogóle... ;]


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
Zgadza się, a odpowiedziałbyś na moje pytanie powyżej? - marek527 2016-01-22 20:55
Nie widzę tam pytania. Skoro są nullami to są nullami w bazie. - Shalom 2016-01-22 21:02
W bazie zarówno Tabela Kategoria jak i Produkt są wypełnione, a w widoku wywołuje coś takiego: <c:forEach items="${product.kategorie}" var="kategoria"> <p>${kategoria.nazwa}</p> </c:forEach>to nic się nie wypisuje. - marek527 2016-01-22 21:08

Pozostało 580 znaków

2016-01-22 21:13
0

Zacznij od tego żeby zapiąć sie debuggerem w kontrolerze, przed wysłaniem danych do widoku i zobacz co tam masz.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
Pokaż pozostałe 5 komentarzy
Pewnie dlatego że nie umiesz debugować, innego wyjaśnienia nie znam :D Szklana kula też mi nic nie mówi. - Shalom 2016-01-22 22:10
Jeśli Ci to sprawi satysfakcje to powiem że nigdy tego dobrze robić nie potrafiłem. Szczególnie jak piszę w nowym środowisku, które poznaje i się dopiero uczę. Reasumując masz jakiś pomysł skąd może wynikać mój błąd? - marek527 2016-01-22 22:12
Nie bo nie wiem co robisz. Stawiasz breakpoint tam gdzie pobierasz dane z bazy? - Shalom 2016-01-22 22:13
Tak robię właśnie. - marek527 2016-01-22 22:16
Pics or it didn't happen. - Shalom 2016-01-22 22:16

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