Zapisywanie danych do bazy ( Spring, Hibernate )

Odpowiedz Nowy wątek
2018-12-30 19:27
0

Cześć mam mały problem, ponieważ utworzyłem sobie bazę danych według własnych potrzeb a gdy zapisuję jakiś obiekt do bazy to tworzy mi zupełnie nową tabelę.

Chodzi mi o to, że moją docelową tabelą jest "daneosobowe" a Spring zapisuje mi do te dane do tabeli, którą sam stworzył "dane_osobowe", dodatkowo pojawiła się jeszcze tabela "hibernate_sequence".
screenshot-20181230192122.png

@GetMapping(path = "/add")
@Transactional
public @ResponseBody String addNewUser(){
    DaneOsobowe dane = new DaneOsobowe();
    dane.setPesel("12345565");
    dane.setImie("maciek");
    dane.setNazwisko("kuba");
    dane.setNumerTel("123455677");
    dane.setUlica("objazdowa");
    dane.setMiasto("Poznan");
    dane.setKodPocz("65-001");

    daneOsoboweRepository.save(dane);

      Lekarz lekarz = new Lekarz();
      lekarz.setDaneOsobowe(dane);

      lekarzRepository.save(lekarz);

    return "Saved";

} 

Tutaj jest interfejs

public interface DaneOsoboweRepository extends CrudRepository<DaneOsobowe, Integer> {
}

Pozostało 580 znaków

2018-12-30 19:28
0

Pokaż konfigurację.

Pozostało 580 znaków

2018-12-30 19:30
0
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://localhost:3306/przychodnia?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=qwerty
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

Pozostało 580 znaków

2018-12-30 19:34
0

A masz może nad którymś z pól klasy strategy = GenerationType.AUTO? Bo z tego co pamiętam to to powodowało tworzenie tej kolumny w Hibernate przed wersją 5.0, dobrze mówię? Jeśli nie to niech ktoś mnie poprawi.
Natomiast nad klasą musisz chyba dodać @Table(name = "daneosobowe"), bo Hibernate/JPA automatycznie tworzy z nazwy daneOsobowe tabelę dane_osobowe.

Natomiast głowy sobie za to uciąć nie dam, za błędy przepraszam.

edytowany 2x, ostatnio: vizzini, 2018-12-30 19:39

Pozostało 580 znaków

2018-12-30 19:47
0

Jak zmienię mu nazwę tabeli @Table(name = "daneosobowe") to mi wywala błędem ;/

java.sql.SQLException: Field 'idDanych' doesn't have a default value

zamiast @Table(name = "daneosobowe") wpisz @Table(name = "dane_osobowe") i napisz co dostajesz - masjav 2018-12-30 19:52

Pozostało 580 znaków

2018-12-30 19:48
0

Pokaż kod cały.

Pozostało 580 znaków

2018-12-30 19:51
0
@Entity
public class DaneOsobowe {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @NotNull
    private String pesel;

    @NotNull
    private String imie;

    @NotNull
    private String nazwisko;

    @NotNull
    private String NumerTel;

    @NotNull
    private String ulica;

    @NotNull
    private String miasto;

    @NotNull
    private String kodPocz;

    public DaneOsobowe(){

    }

plus gettery i settery

@Controller
@RequestMapping(path = "/demo")
public class LekarzController {

    @Autowired
    private DaneOsoboweRepository daneOsoboweRepository;

    @Autowired
    private LekarzRepository lekarzRepository;

    @GetMapping(path = "/add")
    @Transactional
    public @ResponseBody String addNewUser(){
        DaneOsobowe dane = new DaneOsobowe();
        dane.setPesel("12345565");
        dane.setImie("maciek");
        dane.setNazwisko("kuba");
        dane.setNumerTel("123455677");
        dane.setUlica("objazdowa");
        dane.setMiasto("Poznan");
        dane.setKodPocz("65-001");

        daneOsoboweRepository.save(dane);

//        Lekarz lekarz = new Lekarz();
//        lekarz.setDaneOsobowe(dane);
//
//        lekarzRepository.save(lekarz);

        return "Saved";

    }

    @GetMapping(path = "/all")
    public @ResponseBody Iterable<Lekarz> getAll() {
        return lekarzRepository.findAll();
    }

}
public interface DaneOsoboweRepository extends CrudRepository<DaneOsobowe, Integer> {
}

Pozostało 580 znaków

2018-12-30 20:02
0

Ustaw property spring.jpa.hibernate.ddl-auto na validate i spróbuj jeszcze raz

Pozostało 580 znaków

2018-12-30 20:08
0

@GeneratedValue(strategy = GenerationType.AUTO) na @GeneratedValue(strategy = GenerationType.IDENTITY) powinno załatwić sprawę hibernate_sequence. Spróbuj też porady @Pinek

Pozostało 580 znaków

2018-12-30 22:12
0

Jak ustawię w configu opcje validate to mi wywala błędem

 Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [dane_osobowe]

za to jak dam strategy = GenerationType.IDENTITY to wywala mi tak

java.sql.SQLException: Field 'id' doesn't have a default value

chodzi mu o tą linijkę kodu

daneOsoboweRepository.save(dane);

Pozostało 580 znaków

2018-12-30 22:17
0

Teraz jak ustawiłeś te property co ci mówiłem, to Hibernate nie tworzy tabeli, więc jest to, czego chciałeś. Natomiast w takim razie, Hibernate spodziewa się, że już sam taką tabelę stworzyłeś. Hibernate, na podstawie nazwy klasy, szuka tabeli dane_osobowe i jej nie znajduje. Zmień swoją nazwę tabeli z daneosobowe na dane_osobowe (zgodne z nazywaniem tabel w sql), i wtedy już będzie dobrze (tylko pamiętaj, że za kolejne tabele również ty odpowiadasz)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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