Podpiinanie mysql do Springa. Zapisywanie do bazy danych.

0

Jak w temacie. Chciałbym podpiąć mysql do Springa, a potem zapisać w niej przykładowy obiekt przy pomocy Hibernate. Jednak siedzę, czytam i nie jestem wstanie wykombinować jak, nie używając persistence.xml jako persistence unit, tylko wrzucić to wszystko jako właściwości aplikacji. W pliku application.properties umieściłem:

server.port = 8080
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=create
spring.datasource.url=jdbc:mysql://localhost:3306/mojabaza
spring.datasource.username=tutorial
spring.datasource.password=password

W klasie PersonService chciałbym żeby był zapisywany obiekt (najprostszy, jedno pole z Stringiem i jedno z id [GeneratedValue]).

    private  EntityManagerFactory entityManagerFactory;
    private EntityManager entityManager;
                ...
public Person addPerson() {
        Person person = new Person();
        person.setName("Jan");
        entityManager.getTransaction().begin();
        entityManager.persist(person);
        entityManager.getTransaction().commit();
        return person;
    }

Nigdzie nie przypisuję nic do entityManagerFactory i entityManager. Myślałem, żeby w konstruktorze stworzyć EMF i EM, ale nie wiem jak. Wywołuję to w PersonCoontroller. Wiem, że najprawdopodobniej błąd leży że nie została stworzony EntityManager i EntityManagerFactory, tylko nie wiem jak je stworzyć. Program się kompiluje, ale błąd wywala ("java.lang.NullPointerException") przy wysyłaniu requesta wywołującego tą metodę.

1

W springu najwygodniej korzystać ze spring data, nie bezpośrednio z hibernate, poczytaj http://projects.spring.io/spring-data/

0

Ok, dzięki ale teraz mam inny problem. Nie jestem wstanie przypisać do jakiegoś pola PersonRepository, ze względu że jest to interfejs.

public interface PersonRepository extends CrudRepository<Person, Integer> {

    Person findBytName(String firstName);

}

Automatyczne wiązanie nie działa, bo wywala błąd: "Field personRepository in com.example.SpringIHibernate.PersonService required a bean of type 'com.example.SpringIHibernate.PersonRepository' that could not be found."

0

A jak wygląda konteks springa? Ustawiłeś zeby skanował pakiet gdzie masz to repozytorium? Musisz mieć jakieś
<jpa:repositories base-package="twoj.pakiet"/> albo coś podobnego w twoim class configuration. Spring sie sam nie domyśli że gdzieśtam masz coś do zarządzania.

0

Wywaliłem Repozytorium do innego pakietu i wrzuciłem @ComponentScan z nowym pakietem. Wcześniej miałem Repozytorium w pakiecie z aplikacją i nawet jak dałem @ComponentScan z tym pakietem, to nie chciało zaskoczyć. Nie wiem czemu.
Teraz pojawił się inny problem, że Spring chyba nie widzi Controllera i nie umie podmappować metod. Do stworzenia projektu użyłem Spring Initializr z spring.io pod Mavena. Jak stworzyłem taki sam projekt tylko przy użyciu Gradle, to problem nie wystąpił. W Gradle też, tym razem nie użyłem ComponentScan i zadziałało od razu. Możliwe jest, żeby przy tworzeniu w w/w sposób jakimś cudem projekt od razu się wysypał?

0

Trudno wróżyć z fusów co wyprawiasz nie widząc kodu. Biorąc pod uwagę że nie bardzo rozumiesz co robisz to pewnie to ComponentScan było w jakimś miejscu bez sensu i dlatego w ogóle nie bylo brane pod uwagę.

0

ComponentScan było w klasie z SpringBootApplication i na początku jako parametr podałem domyślny pakiet z wszystkimi klasami, potem zrobiłem to co wcześniej wspomniałem, czyli zmieniłem pakiet, do którego potem przerzuciłem Repozytorium i podałem go jako parametr. Dzięki, za pomoc.

0

Gdybyś używał IntelliJ to on ma magiczne pluginy do Springa i pokazuje przy ComponentScan wszystkie beany które spring znalazł i wiadomo od razu kiedy coś jest nie tak.

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