Cześć.
-
Załóżmy, że powstaje projekt pod określoną branżę (chodzi głównie o wystawienie RestAPI), dla przykładu załóżmy, że jakaś aplikacja do zarządzania drużyną piłkarską. I w którymś momencie stwierdzamy, że przecież taka aplikacje też nadawałaby się na podobne branże - np, do zarządzania drużyną koszykarską, potem hokejową itd. Część modeli danych, encji i funkcjonalności będzie podobna, część specyficzna pewnie dla konkretnej wersji. I teraz moje pytanie - jak najlepiej podejść do takiego typu projektu ? Czy wydzielić bazę(część wspólną) i każdy konkretny, nowy projekt zaczynać od tego, czy są jakieś inteligentniejsze sposoby ?
-
Zestaw tych pytań dotyczy JPA, Hibernata i Spring Daty. Po pierwsze czy winno się użwać tego ostatniego ? Bo wprowadza on dziwne bardzo zachowania - np przy ładowaniu obiektu, który ma kolekcje, to owa kolekcja jest ładowana od razu, a przecież @OneToMany jest domyślnie LAZY.
Po drugie, mam np zamodelowany obiekt rozmowy i listy wiadomości w niej:
@Entity
public class Conversation {
@GeneratedValue(strategy = GenerationType.AUTO)
@Id
private long id;
@ElementCollection
@org.hibernate.annotations.OrderBy(clause = "creationDate DESC")
private Collection<Message> messages = new ArrayList<>();
private Date lastMessageDate;
}
@Embeddable
public class Message {
@NotNull
@Column(nullable = false)
private Date creationDate;
@NotNull
@Column(nullable = false)
private String text;
}
Takie mapowanie nie utworzyło mi żadnego klucza głównego w tablicy Conversation_messages. Czy powinienem w tym przypadku użyć jeszcze @CollectionId ? Jeśli tak to jaki typ generatora tam powinienem podać ? Zastanawiałem się też czy nie użyć Seta albo Listy zamiast Collection ale dla tego przypadku to wydawało mi się najlepsze.
Dalej, jeśli chodzi o dodawanie nowej wiadomości do rozmowy:
@Transactional
public Conversation addMessage() {
Conversation conversation = conversationDAO.findOne(2L);
Message m = new Message(new Date(), "Any message content");
conversation.getMessages().add(m);
return conversation
}
Dlaczego takie coś usuwa wszystkie wiadomości i potem dodaje je na nowo razem z tą nową ? Da się jakoś napisać za pomocą JPQL po prostu wstawianie nowej wiadomości do tabeli ? Bo nie mogę sobie rozszerzyć JpaRepository z typem Message hmm.
Ostatnie pytanie na tą chwilę dotyczy ustawienia dat. Obecnie ustawiam ją za pomocą new Date(). Próbowałem adnotacji @CreationDate, nie działało - czy Spring Data jakoś temu przeszkadza ?