Java tutorial
/** * Copyright 2014 David L. Whitehurst * * Licensed under the Apache License, Version 2.0 * (the "License"); You may not use this file except * in compliance with the License. You may obtain a * copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied. See the License for the specific * language governing permissions and limitations under the * License. * */ package org.musicrecital.dao.hibernate; import org.musicrecital.dao.UserDao; import org.musicrecital.model.User; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; import org.springframework.orm.hibernate4.SessionFactoryUtils; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Repository; import javax.persistence.Table; import java.util.List; import org.hibernate.Query; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.criterion.Restrictions; /** * This class interacts with Hibernate session to save/delete and * retrieve User objects. * * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a> * Modified by <a href="mailto:dan@getrolling.com">Dan Kibler</a> * Extended to implement Acegi UserDetailsService interface by David Carter david@carter.net * Modified by <a href="mailto:bwnoll@gmail.com">Bryan Noll</a> to work with * the new BaseDaoHibernate implementation that uses generics. * Modified by jgarcia (updated to hibernate 4) * @author <a href="mailto:dlwhitehurst@gmail.com">David L. Whitehurst</a> * @version $Id: 1a36674ed7f4de7fea4bc61e46397e4bc51a3ead $ */ @Repository("userDao") public class UserDaoHibernate extends GenericDaoHibernate<User, Long> implements UserDao, UserDetailsService { /** * Constructor that sets the entity to User.class. */ public UserDaoHibernate() { super(User.class); } /** * {@inheritDoc} */ @SuppressWarnings("unchecked") public List<User> getUsers() { Query qry = getSession().createQuery("from User u order by upper(u.username)"); return qry.list(); } /** * {@inheritDoc} */ public User saveUser(User user) { if (log.isDebugEnabled()) { log.debug("user's id: " + user.getId()); } getSession().saveOrUpdate(user); // necessary to throw a DataIntegrityViolation and catch it in UserManager getSession().flush(); return user; } /** * Overridden simply to call the saveUser method. This is happening * because saveUser flushes the session and saveObject of BaseDaoHibernate * does not. * * @param user the user to save * @return the modified user (with a primary key set if they're new) */ @Override public User save(User user) { return this.saveUser(user); } /** * {@inheritDoc} */ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { List users = getSession().createCriteria(User.class).add(Restrictions.eq("username", username)).list(); if (users == null || users.isEmpty()) { throw new UsernameNotFoundException("user '" + username + "' not found..."); } else { return (UserDetails) users.get(0); } } /** * {@inheritDoc} */ public String getUserPassword(Long userId) { JdbcTemplate jdbcTemplate = new JdbcTemplate(SessionFactoryUtils.getDataSource(getSessionFactory())); Table table = AnnotationUtils.findAnnotation(User.class, Table.class); return jdbcTemplate.queryForObject("select password from " + table.name() + " where id=?", String.class, userId); } }