Hibernae leniwe pobieranie w Many to Many?

Hibernae leniwe pobieranie w Many to Many?
EI
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 2 lata
0

Witajcie,

Mam taką asocjajce ManyToMany:

Kopiuj
@Entity
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE, region="clases.question")
@Table(name = "QUESTIONS")
@SequenceGenerator(name="PK",sequenceName="GEN_QUESTIONS_ID",allocationSize=1)
public class Question implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="PK")
@Column(name = "ID")     
private int id;

@Version                                                                   
@Column(name = "VERSION")
private int version;

@Column(name = "DESCRIPTION")
private String description;

@Column(name = "ACTIVE")
boolean active;

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name="QUESTIONS_AREAS", 
           joinColumns={@JoinColumn(name="QUESTIONS_ID")},
           inverseJoinColumns={@JoinColumn(name="AREAs_ID")})
private Set<Area> areas = new HashSet<Area>(0);code>

Przy próbie wyciągnięcia HashSeta wywal mi błąd:

` failed to lazily initialize a collection of role: clases.Question.areas, could not initialize proxy - no Session`

Oczywiście jak zmienię pobieranie obiektów na: fetch = FetchType.EAGER to wszystko działa.
Ale niebardzo rozumem dlaczego nie chce działać domyśnie na lazily? Nie powinien załadowąć sobie kolekci przy próbie jej wywołania?

```java
System.out.println(q.getAreas().toString());
edytowany 2x, ostatnio: Eiten
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

Ech, słabo mi. Potem sie ludzie dziwią że im sie coś ładuje 5 minut a do bazy leci tysiac zapytań bo geniusz zrobił "lazy". Jeśli faktycznie często wyciągasz tylko obiekty Question i nie korzystasz z tych Area (w co wątpię...) to zostaw lazy ale w DAO zrób dwie osobne metody. Jedna która wyciąga tak jak masz teraz i tej uzywaj tam gdzie nie potrzebujesz Area, a druga metoda niech robi fetch join na tym polu (wczyta sobie te Area od razu, jednym zapytaniem) i jej używaj tam gdzie potrzebujesz Area.

Za zostawienie lazy i liczenie na to że "dociagnie sobie jak będzie potrzebne" to powinni łamać kołem i rwać pasy ze skóry...

A czemu ci to nie działa? Bo na szczęście jak zamykasz transakcję to sesja jest ubijana i tam gdzie próbujesz się odwołać do tych swoich Area sesja nie jest już otwarta i nie można sobie nic dociągnąć.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
niezdecydowany
niezdecydowany
chcesz mieć osobną metodę w dao która weźmie tylko elementy area danego question ?
n0name_l
@niezdecydowany Nie. Jedna metoda wyciąga obiekt "płytki", to jest bez składowych obiektów (tj. obiektów przy 1-1, 1-n, etc, gdzie trzeba zrobić jakiegoś joina) i taki też zwraca. Druga metoda wyciąga cały graf, czyli obiekt ze składowymi.
niezdecydowany
niezdecydowany
możesz w hajbernejdzie dynamicznie ustawić fetch type ?
Shalom
@niezdecydowany i co by to niby miało znaczyć? o_O Możesz w trakcie wykonywania zapytania zdecydować które powiązania ma wyciągnąć a które nie poprzez fetch join ;]
n0name_l
Mogę napisać zapytanie wyciągające co potrzebuje. :|
niezdecydowany
niezdecydowany
nie czaje po co to 0.o ? nie mam z tym komercyjnie do czynienia, tak więc jak widzę taki tip, wole się dopytać...
Shalom
Ale po co co? Umiesz ty zadać sensowne pytanie? :D
niezdecydowany
niezdecydowany
niet
EI
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 2 lata
0

Ok, w Hibernate dopiero raczkuje, a w podręcznikach zalecają stosować wszędzie lazy. Jak widać znów praktyka wygrywa z teorią. Dzięki i informacje.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

No stosowanie wszędzie eager też dobre nie jest bo wyciągasz sobie z bazy mały obiekt a przy okazji wyrywasz pół bazy powiązań ;) Po prostu trzeba myśleć o tym co i dlaczego robisz. Lepiej mieć kilka metod w dao, które wyciągają obiekt + jakieś konkretne powiązania niż zdawać sie na ślepy los ;)


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.