Witam,
Mam zamiar zacząć pisać prostą aplikację webową opartą na Spring MVC i Hibernate. Mam kilka pytań odnośnie struktury modelu danych oraz Hibernate.
Co do struktury będzie ona dosyć standardowa:
- encje jpa,
- klasy DAO (@Repository),
- serwisy (@Transactional, @Service),
- controllery spring
- widok - strony jsp.
- Zastanawiam się nad modelem danych przeznaczonym do komunikacji z widokiem. Aktualnie przychodzi mi do głowy albo przesyłanie obiektów encji (Czy to nie będzie mieszanie warstw aplikacji?) albo utworzenie specjalnych obiektów DTO i wrzucenie tam tylko potrzebnych danych (z tym, że trochę szkoda roboty na przepisywanie kodu) lub może utworzenie controllerow restowych. Jakie waszym zdaniem jest najlepsze rozwiązanie?
Teraz odnosnie Hibernate:
bazując na przykladowym modelu:
@Entity
@Table(name = "apps")
public class App {
@Id
@GeneratedValue
private int id;
private String city;
@OneToMany(mappedBy = "app", cascade = CascadeType.ALL)
private Set<User> users = new HashSet();
//settery, gettery
}
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue
private int id;
private String name;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private Set<Phone> phones = new HashSet();
@ManyToOne
@JoinColumn(name = "app_id")
private App app;
//gettery, settery
}
@Entity
@Table(name = "phones")
public class Phone {
@Id
@GeneratedValue
private int id;
private String number;
//settery, gettery
}
W celu uniknięcia LazyInitializationException wykonuję fetch joiny. I teraz tak (pewnie to jest głupie pytanie):
- Załóżmy, że chce pobrac sobie obiekt App o określonym identyfikatorze dołączając do niego zbiór Userow ALE WYKLUCZAJĄC WSZYSTKIE RELACJE w obiekcie User ( w tym przypadku Set<Phone>). Jak to najprościej zrobic?
Dlaczego o to pytam. Załóżmy że pobiorę obiekt App (dla powyższych warunkow) wyjdę nim poza warstwę serwisową, czyli poza sesje hibernate i niechcący pobiorę sobie Zbior Set<Phone> z obiektu User. Wtedy poleci LAzyInitializationException - tego chce uniknąć.
Ale może coś zle rozumiem?
Shalom