Spring Hibernate

dpienczyn
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 49
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

lukaszek016
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 249
0

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

lukaszek016
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 249
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.

dpienczyn
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 49
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

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

Metoda w ProductDAO

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

lukaszek016
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 249
0

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

Kopiuj
    @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

Kopiuj
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?

dpienczyn
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 49
0

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

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

ProductDAO

Kopiuj
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); 

dpienczyn
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 49
0
dpienczyn napisał(a):

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

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

ProductDAO

Kopiuj
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

Kopiuj
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)
);
lukaszek016
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 249
0

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

dpienczyn
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 49
0
lukaszek016 napisał(a):

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

Kopiuj
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)
);
dpienczyn
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 49
0

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

Kopiuj
@Column(name="userid")
    private Integer id;
Kopiuj
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`)
);
Kopiuj
@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 ]"

dpienczyn
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 49
0

a jak zmieniłam w metodzie:

Kopiuj
@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

lukaszek016
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 249
0

Po wpisaniu treści w google pierwszy wynik:
https://stackoverflow.com/questions/2302802/object-references-an-unsaved-transient-instance-save-the-transient-instance-be

Ale wątpię, że to wystarczy. Przekazujesz do metody obiekt typu User. I potem przypisujesz do parametru userid obiekt User. I potem cały obiekt user porównujesz z liczbą userid, nie wiem jakim cudem miałoby to działać...

Po pierwsze jako parametr przekaż id tego użytkownika. Możesz to napisać tak

Kopiuj
from Product where Product.userid=:id

I używasz Hibernate i musisz pisać takie proste zapytania? :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.