Spring Hibernate

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

0

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

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.

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

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?

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

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

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

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)
);
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 ]"

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

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

from Product where Product.userid=:id

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

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