Cześć.

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

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