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

0

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

0

Proszę bardzo odpaliłem wszystko w trybie DEBUG, ustawiłem breakpointy i w oknie variables nie mam żadnej zmiennej. Pewnie robię coś źle.

0

Robisz. Bo jeszcze musisz tak zrobić żeby program wszedł w to miejsce gdzie jest breakpoint :D Otworzyć przeglądarkę i wejść pod dany adres czy coś.

0

Podsumowując problem jaki mam.

Mając dwie encje będące w relacji wiele do wielu nie mogę wczytać

Set <Kategoria> kategorie

pomimo tego że jest on wypełniony w bazie danych.

 
@Entity
@Table(name="Produkt")
public class Produkt {
	
	@Id
	@GeneratedValue
	private int idProdukt;
	private String status;
	private String nazwa;
	@ManyToMany(fetch = FetchType.EAGER, mappedBy= "produkty")
	private Set <Kategoria> kategorie;
	}


@Entity
@Table(name="Kategoria")
public class Kategoria {
	@Id
	@GeneratedValue
	private int idKategoria;
	private String nazwa;
	@ManyToMany(fetch = FetchType.EAGER)
	private Set <Produkt> produkty;
}

To nie zwraca mi nic w widoku i pętla nie obraca się ani razu:
<

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

Chłopie, użyj tego debuggera, innej drogi nie ma. Serio. Zresztą nie wiem czego od nas oczekujesz. My serio nie mamy szklanych kul i nie widzimy twojego kodu i nie wiemy co się tam u ciebie dzieje.

0

Pewnie w konfiguracji masz create-drop gdzieś albo operujesz na kolekcji pobranej z bazy przy aktywnej sesji i jak sobie coś z tego usuniesz to jest propagowane do bazy. Pamiętaj że przy aktywnej sesji zmiana stanu obiektu encyjnego zmienia stan także w bazie!

0

hibernate.hbm2ddl.auto value="create-drop" - na jaką wartość zmienić parametr, aby poprawnie odczytywać dane z bazy (bez usuwania tabel) a póżniej coś dodawać do bazy?

0

Chwila szukania w dokumentacji/google. Użyj update.

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