Spring Hibernate

Odpowiedz Nowy wątek
2018-03-29 13:04
0

Hej mam pytanie robię aplikacje i potrzebuje zrobić coś takiego, że każdy użytkownik który będzie dodawał swoje produkty do bazy to po zalogowaniu będzie widział tylko te co wprowadził.. Nie wiem za bardzo jak mam to zrobić.. Pozdrawiam

Pozostało 580 znaków

2018-03-29 13:08
0

A coś więcej o tej aplikacji? Webowa, desktop?

Pokaż pozostałe 3 komentarze
Rozumiem, że Spring Security masz zaimplementowane? - lukaszek016 2018-03-29 13:10
Wyciągasz login aktualnie zalogowanego użytkownika i wyciągasz z bazy i w przypadku dodawania dołączasz użytkownika do produktu, a w przypadku wyświetlania piszesz w repozytorium metodę powiedzmy GetAllProductsByUser i podajesz użytkownika. - lukaszek016 2018-03-29 13:13
a ok rozumiem dzieki :) - dpienczyn 2018-03-29 13:14
a z tym użytkownikiem którego dołączam do productu to w tabeli product robię @ManyToOne? Dobrze myśle? - dpienczyn 2018-03-29 13:17

Pozostało 580 znaków

2018-03-29 13:21
1

Masz tu opisane jak wyciągnąć login użytkownika na kilka sposób:

http://www.baeldung.com/get-user-in-spring-security

Co do ostatniego komentarza wyżej.

Tak, robisz relację ManyToOne z użytkownikiem, z tym, że w klasie Product jako pole użytkownika wstawiasz obiekt typu User.

no rozumiem bo właśnie na początku tak zrobiłam ale dalej nie wiedziałam jak.. - dpienczyn 2018-03-29 13:22

Pozostało 580 znaków

2018-03-30 00:57
0

Mam pytanie zmieniłam już troche rzeczy ale mam pewne wątpliwości bo coś mi nie działa... Może spojrzeć na to jak to zrobiłam?

Tabela product

@ManyToOne
    @JoinColumn(name = "id")
    private User user;

Metoda w ProductDAO

public void getAllProductsByUser(User user);
@Override
    public void getAllProductsByUser(User user) {
         sessionFactory.getCurrentSession().merge(user);

    }

Pozostało 580 znaków

2018-03-30 06:38
0

Nie nazywaj w JoinColumn id, bo to nazwa kolumny z użytkownikiem. Może być np. tak:

    @Valid
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "user_id", nullable = false)
    private User user;

Co do reszty. Przyznam szczerze, że nie używałem SessionFactory, tak jak Ty to robisz, ale merge to nie służy chyba do wyciągania danych tylko do aktualizacji. Ja u siebie tworzyłem interfejs rozszerzający klasę JpaRepository i generalnie deklaracja metody

public ArrayList<Product> findByUser(User user); 

i wywołanie jej w klasie serwisu zwróciłoby listę produktów tego użytkownika.

Pokaż więcej klasy ProductDAO. Poza tym, są jakieś błędy, wyjątki, cokolwiek?

Ale głupotę napisałem. Interfejs JpaRepository, a nie klasę :) - lukaszek016 2018-03-30 09:52

Pozostało 580 znaków

2018-03-30 15:46
0

w sumie zrobiłam tak ale nie wiem czy dobrze?

@Override
    public List<Product> findByUser(User user) {
        return sessionFactory.getCurrentSession().createQuery("from Product where userid=?").list();
    }

ProductDAO

public void saveOrUpdate(Product product);

 public void delete(int productId);
 public Product get(int productId);
 public List<Product> getAllProducts();
 public List<Product> findByUser(User user); 
edytowany 1x, ostatnio: dpienczyn, 2018-03-30 15:47

Pozostało 580 znaków

2018-03-30 15:48
0
dpienczyn napisał(a):

w sumie zrobiłam tak ale nie wiem czy dobrze?

@Override
  public List<Product> findByUser(User user) {
      return sessionFactory.getCurrentSession().createQuery("from Product where userid=?").list();
  }

ProductDAO

public void saveOrUpdate(Product product);

 public void delete(int productId);
 public Product get(int productId);
 public List<Product> getAllProducts();
 public List<Product> findByUser(User user); 

Tak połączyłam tabele w bazie

CREATE TABLE APP_USER_PRODUCT (
    userid BIGINT NOT NULL,
    product_id int(11) NOT NULL,
    PRIMARY KEY (userid, product_id),
    CONSTRAINT FK_APPUSER FOREIGN KEY (userid) REFERENCES APP_USER (id),
    CONSTRAINT FK_PRODUCT FOREIGN KEY (product_id) REFERENCES PRODUCT (productId)
);

Pozostało 580 znaków

2018-03-30 16:01
0

A po co Ci tam relacja ManyToMany? Nie wystarczy ManoToOne?

Pozostało 580 znaków

2018-03-30 16:18
0
lukaszek016 napisał(a):

A po co Ci tam relacja ManyToMany? Nie wystarczy ManoToOne?

CREATE TABLE APP_USER_PRODUCT (
    userid BIGINT NOT NULL,
    product_id int(11) NOT NULL,
    PRIMARY KEY (product_id),
    CONSTRAINT FK_APPUSER FOREIGN KEY (userid) REFERENCES APP_USER (id)
);
Teraz chyba jest okej? - dpienczyn 2018-03-30 16:19
Czy jako PRIMARY KEY musze jeszcze podac userid? - dpienczyn 2018-03-30 16:39
Wywal ta tabele. Oprócz niej masz jeszcze tabele user i product tak? - lukaszek016 2018-03-30 16:45
Wyjaśnij mi zatem po co Ci ta 3 tabela przy relacji ManyToOne - lukaszek016 2018-03-30 16:48

Pozostało 580 znaków

2018-04-03 09:06
0

Tak jak napisałam potrzebna mi jest lista produktów zalogowanego użytkownika więc pozmieniałam kilka rzeczy i zrobiłam:

@Column(name="userid")
    private Integer id;
CREATE TABLE `product` (
  `productId` int(11) NOT NULL AUTO_INCREMENT,
  `nazwa` varchar(45) NOT NULL,
  `ilosc` varchar(512) NOT NULL,
  `opis` varchar(512) NOT NULL,
  `cal` int(11) NOT NULL,
  `categoryId` int(11) NOT NULL,
  `userid` BIGINT NOT NULL,
  PRIMARY KEY (`productId`),
  KEY `fk_category` (`categoryId`),
  KEY `fk_appuser` (`userid`),
  CONSTRAINT `fk_category` FOREIGN KEY (`categoryId`) REFERENCES `category` (`categoryId`),
  CONSTRAINT `fk_appuser` FOREIGN KEY (`userid`) REFERENCES `app_user` (`userid`)
);
@Override
    public List<Product> findByUser(User user) {
        return sessionFactory.getCurrentSession().createQuery("from Product where userid=:userid ").list();
    }

I dostaje bład "HTTP Status 500 - Request processing failed; nested exception is org.hibernate.QueryException: Not all named parameters have been set: [userid] [from Product where userid=:userid ]"

Pozostało 580 znaków

2018-04-03 09:45
0

a jak zmieniłam w metodzie:

@Override
    public List<Product> findByUser(User user) {
        return sessionFactory.getCurrentSession().createQuery("from Product where userid=:userid ").setParameter("userid", user).list();
    }

to dostaje błąd > HTTP Status 500 - Request processing failed; nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.pack.model.User

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