Wczytywanie danych z bazy

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?

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?

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}

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 ;]

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.

0

A masz gettery do tego pola?

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ć?

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

0

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

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