Rejestracja w Spring Security

0

Uczę się springa security i jestem na etapie rejestracji i logowania uzytkownika z pomocą Hibernate i bazy MySQL.W bazie mam tabele " users" (pola username i password) a także " authorities"(username,i authority).To co umiałem do tej pory czyli zapisywanie do jednej tabeli za pomocą "saveOrUpdate" działa OK.Z tym że żeby zarejestrowany użytkownik mógł się zalogować musi się znaleźć też w tabeli authorities(do której nie mam zrobionej klasy Entity), no więc wymyśliłem że przy zapisywaniu obiektu utworze zapytanie które go tam wsadzi.
Wklejam klase z metodą stanowiącą problem

 package com.offersapp.dao;

import javax.persistence.Query;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.offersapp.domain.User;

@Repository
public class UsersDaoImpl implements UsersDao {
	@Autowired
	private SessionFactory sessionFactory;

	@Override
	public void saveUser(User user) {
		Session session = sessionFactory.getCurrentSession();

		session.saveOrUpdate(user);
		Query query = session.createQuery("insert into authorities (username,authority) values(:val1,:val2)");
		query.setParameter("val1", user.getUsername());
		query.setParameter("val2", "user");
		query.executeUpdate();

	}

}

Dostaje taki exception,
Swoją drogą gdzie tego szukać: "line 1 column 46",bo nie wiem jak to czytać?

 SEVERE: Servlet.service() for servlet [DispatcherServlet] in context with path [/OffersApp] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: values near line 1, column 46 [insert into authorities (username,authority) values(:val1,:val2)]] with root cause
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: values near line 1, column 46 [insert into authorities (username,authority) values(:val1,:val2)]
0

Jeżeli się nie mylę, HQL nie ma czegoś takiego jak typowy INSERT. Tu możesz sobie poczytać o tym więcej https://docs.jboss.org/hibernate/orm/4.0/devguide/en-US/html/ch04.html#d0e2116

W skrócie chodzi o to, że nie wspiera on składni: INSERT INTO … VALUES.......... za to wspiera składnie: INSERT INTO … SELECT …

Wynika z tego, że można w jednej bazie zapisać dane pobrane z innej. Poniżej masz przykład jak taki INSERT powinien wyglądać

 Query query = session.createQuery("insert into  authorities (username,authority) " +
    			"select (user_name, password) from users ");
int result = query.executeUpdate();
0

Pisząc

 session.createQuery()

Tworzysz zapytanie HQLowe, nie SQLowe. HQL działa na obiektach javowych. Więc albo zmienisz query na HQLowe, albo będziesz robił natywne sql query (tylko wtedy musisz uważać jeśli wspierasz więcej niż jeden typ baz danych)

 session.createSQLQuery()
0

No tak,dzięki
Edytowałem zapytanie

 public void saveUser(User user) {
		Session session = sessionFactory.getCurrentSession();

		session.saveOrUpdate(user);
		Query query = session.createNativeQuery("insert into authorities (username,authority) values(:val1,:val2)");
		query.setParameter("val1", user.getUsername());
		query.setParameter("val2", "user");
		int result = query.executeUpdate();

	}

Ale wciąz nie działa, ponieważ:

 Caused by: java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`spring`.`authorities`, CONSTRAINT `fk_username` FOREIGN KEY (`username`) REFERENCES `users` (`username`))

Moja wiedza z SQL jest znikoma, ale jak rozumiem ten błąd wynika z tego że nie można wysłać tego zapytania jeśli w tabeli "users" nie będzie odpowiedniego użytkownika. No ale najpierw ten użytkownik jest dodawany do tabeli "users",a dopiero póżniej jest wysyłane zapytanie o dodanie do tabeli "authorities. A tak jak pisałem wcześniej metoda "saveOrUpdate" działa OK, bo gdy usunę zapytanie INSERT z metody to użytkownik jest dodawany do bazy "users" bez problemów.
No ale tak jak pisałem z SQL wiem niewiele,więc może źle to pojmuję.

Albo ewentualnie jakie inne rozwiązanie jest możliwe do dodania jednego obiektu do dwóch tabel, zakładając że w tej drugiej tabeli w jedynej różnej kolumnie chce ustawić domyślny tekst więc nie potrzebuje robić do niej zmiennej,a więc jak wydaje mi się tworzyć nowej klasy Entity też tworzyć nie muszę

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