z JDBC na JPA

1

Witam, napisałem kod historii logowania (jdbc), ale potrzebuję to samo w JPA Hibernate. I nie wiem jak to napisać, proszę o pomoc.

	


	private static Timestamp getCurrentDate() {
	    java.util.Date today = new java.util.Date();
	    return new java.sql.Timestamp(today.getTime());
	}
	//Dodaje historiê dla ostatniego logowania
	//id_user jest to wartoœæ identyfikuj¹ca danego u¿ytkownika
	public void add_history(int id_user) throws SQLException{
		try{
			int id_max = last_id("login_history");
			id_max += 1;
			
			PreparedStatement pStmt = conn.prepareStatement("INSERT INTO login_history(ID, id_user, date) values(?,?,?)");
			pStmt.setInt(1, id_max);
			pStmt.setInt(2, id_user);
			pStmt.setTimestamp(3, getCurrentDate());
			pStmt.executeUpdate();
			pStmt.close();
		}catch (SQLException E){
			System.out.println(E);
		}
	}
	//Zwraca ostatnie ID w tablicy
	public int last_id(String table) throws SQLException {
		int id_max = 0;
		Statement stmt = conn.createStatement();
		ResultSet rs = stmt.executeQuery("SELECT MAX(ID) AS maxID FROM " + table);
		
		if (rs.next()){
			id_max = rs.getInt("maxID");
		}
		rs.close();
		stmt.close();
		return id_max;
	} 
1
  1. Zapoznaj się jak stworzyć encje (pamiętaj o zarejestrowaniu w persitance.xml). Możesz wygenerować @Entity na podstawie istniejącej tabeli w bazie.
  2. Do zapisu do bazy używasz usługi EntityManager: em.create(obiekt).
  3. Zapytania natywne jak SELECT można używać w JPA poczytaj o @NamedNativeQuery:
    https://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/Native.
  4. Przydałoby się jakieś repozytorium / DAO: http://www.adam-bien.com/roller/abien/entry/ejb_3_persistence_jpa_for

w przypadku natywnych UPDATE uważaj na cache: JPQL jest bezpieczniejszy.

0

może nie sprecyzowałem pytania :P

Encje, mapowanie itp posiadam, chodziło mi bardziej o tą historię logowania jako kontynuacja projektu :P

Napisałem na szybko ją tak jak powyżej, ale nie mam pojęcia jak...

0

Jedna z klas, która Ci będzie potrzebna będzie wyglądać mniej więcej tak:

@Entity
public class LoginHistory {

    @Id
    @GeneratedValue
    private long id;

    @NotBlank
    private long idUser;

    private Timestamp date;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public long getIdUser() {
        return idUser;
    }

    public void setIdUser(long idUser) {
        this.idUser = idUser;
    }

    public Timestamp getDate() {
        return date;
    }

    public void setDate(Timestamp date) {
        this.date = date;
    }
}

Pozdrawiam :)

0

no co ty nie powiesz antek -.- @TeMPOraL jest z swinga jak się nie mylę, ja jego nie używam.

0

Chodziło mi bardziej o samą akcję po kliknięciu przycisku zaloguj, żeby się zapisywało do bazy, zapewne trzeba persist(user) walnąć, ale nie wiem jak to zapisać.

2

Raczej nie potrzebujesz JPA i wygląda na to, że robisz sobie krzywdę. Ale jeśli koniecznie chcesz:
http://www.oracle.com/technetwork/articles/java/persistenceapi-135534.html

Metoda zapisująca kolekcję obiektów robi mniej więcej coś takiego:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("league");
EntityManager em = emf.createEntityManager();
        
em.getTransaction().begin();
        
for(Team team: teams) {
    em.persist(team);
}

em.getTransaction.commit();
em.close();
emf.close()

Team to oczywiscie @Entity.

W tym przykładzie w ramach jednej transakcji zapisujesz wiele obiektów. W normalnych okolicznościach praca z JPA jest dużo prostsza i nie musisz ręcznie zarządzać transakacjami (poczytaj o @Transactional, Spring-TX i JTA).

0

dzięki :)

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