Hibernate 尝试使用@PostConstruct填充数据库时出现问题
我试图通过Spring和Hibernate来填充新创建的数据库模式 我的Hibernate 尝试使用@PostConstruct填充数据库时出现问题,hibernate,spring-mvc,spring-security,Hibernate,Spring Mvc,Spring Security,我试图通过Spring和Hibernate来填充新创建的数据库模式 我的@PostConstruct课程是: @Component public class DataInitializer { @Autowired private UserService userService; @Autowired private UserProfileService userProfileService; @PostConstruct public vo
@PostConstruct
课程是:
@Component
public class DataInitializer {
@Autowired
private UserService userService;
@Autowired
private UserProfileService userProfileService;
@PostConstruct
public void firstLoad() {
if (!(userProfileService.findAll().size() > 0)) {
System.out.println("persistUserProfiles()");
persistUserProfiles();
} else {
System.out.println("persistUserProfiles() NOT EXECUTED!");
}
if (userService.findAll().size() == 0) {
System.out.println("loadDefaultUser()");
loadDefaultUser();
} else {
System.out.println("loadDefaultUser() NOT EXECUTED!");
}
}
private void loadDefaultUser() {
User user = new User();
user.setSsoId("master");
user.setPassword("$2a$10$Jv/rZ8wa7XiRY8XZ1lpIMeXL/Mol0Eda4XxHM7BE2Ui6BxpLZ95He");
user.setFirstName("HRM");
user.setLastName("Master User");
user.setEmail("email@email");
user.setState(State.ACTIVE.getState());
user.setUserProfiles(loadDefaultUserProfiles());
userService.save(user);
}
private Set<UserProfile> loadDefaultUserProfiles() {
Set<UserProfile> userProfiles = new HashSet<UserProfile>();
userProfiles.add(userProfileService.findByType(UserProfileType.USER.getUserProfileType()));
userProfiles.add(userProfileService.findByType(UserProfileType.ADMIN.getUserProfileType()));
userProfiles.add(userProfileService.findByType(UserProfileType.DBA.getUserProfileType()));
return userProfiles;
}
private void persistUserProfiles() {
UserProfile user = new UserProfile(UserProfileType.USER.getUserProfileType());
userProfileService.save(user);
UserProfile admin = new UserProfile(UserProfileType.ADMIN.getUserProfileType());
userProfileService.save(admin);
UserProfile dba = new UserProfile(UserProfileType.DBA.getUserProfileType());
userProfileService.save(dba);
}
}
输出明确指出问题出在UserProfile
实体上,该实体定义为:
@Column(name="type", length=15, unique=true, nullable=false)
private String type = UserProfileType.USER.getUserProfileType();
// Constructor used only for initial data loading, not used after
public UserProfile() {
}
// Constructor used only for initial data loading, not used after
public UserProfile(String type) {
super();
this.type = type;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
用于定义UserProfileType
的枚举为:
USER("USER"),
DBA("DBA"),
ADMIN("ADMIN");
String userProfileType;
private UserProfileType(String userProfileType){
this.userProfileType = userProfileType;
}
public String getUserProfileType(){
return userProfileType;
}
编辑:包括(希望)相关代码
@Service("userService")
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserDao dao;
@Autowired
private PasswordEncoder passwordEncoder;
public void save(User user){
user.setPassword(passwordEncoder.encode(user.getPassword()));
dao.save(user);
}
public void saveOrUpdate(User user) {
// user.setPassword(passwordEncoder.encode(user.getPassword()));
dao.saveOrUpdate(user);
(...)
}
PasswordEncoder是org.springframework.security.crypto.password.PasswordEncoder
@Repository("userDao")
public class UserDaoImpl extends AbstractDao<String, User> implements UserDao {
public void save(User user) {
persist(user);
}
public void saveOrUpdate(User user) {
saveOrUpdate(user);
}
(...)
}
@Repository(“userDao”)
公共类UserDaoImpl扩展了AbstractDao,实现了UserDao{
公共作废保存(用户){
持久化(用户);
}
公共无效保存或更新(用户){
保存或更新(用户);
}
(...)
}
以及处理会话的抽象类:
public abstract class AbstractDao<PK extends Serializable, T> {
private final Class<T> persistentClass;
@SuppressWarnings("unchecked")
public AbstractDao(){
this.persistentClass =(Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[1];
}
@Autowired
private SessionFactory sessionFactory;
protected Session getSession(){
return sessionFactory.getCurrentSession();
}
@SuppressWarnings("unchecked")
public T getByKey(PK key) {
return (T) getSession().get(persistentClass, key);
}
public void persist(T entity) {
getSession().persist(entity);
}
public void saveOrUpdate(T entity) {
getSession().saveOrUpdate(entity);
}
(...)
}
公共抽象类AbstractDao{
私有最终类persistentClass;
@抑制警告(“未选中”)
公开摘要(){
this.persistentClass=(Class)((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[1];
}
@自动连线
私人会话工厂会话工厂;
受保护会话getSession(){
返回sessionFactory.getCurrentSession();
}
@抑制警告(“未选中”)
公共T getByKey(主键){
return(T)getSession().get(persistentClass,key);
}
公共实体(T实体){
getSession().persist(实体);
}
公共作废保存或更新(T实体){
getSession().saveOrUpdate(实体);
}
(...)
}
发生了什么事?正在创建所有表,并填充user_profile表,但将用户配置文件分配给未持久化的“主”用户时,DataInitializer
类失败
我错过了什么?提前感谢。使用
userService.save或update
而不是userService.save
。这应该行得通,如果行,那么我将添加解释作为答案。@Mubin,userService是一个接口,我必须在DAO层上实现saveOrUpdate
方法,不用担心。但是,当我尝试运行时,出现了一个与密码相关的java.lang.StackOverflowerError
。注释掉密码行,我仍然得到同样的错误。请发布userService的相关部分。
@Repository("userDao")
public class UserDaoImpl extends AbstractDao<String, User> implements UserDao {
public void save(User user) {
persist(user);
}
public void saveOrUpdate(User user) {
saveOrUpdate(user);
}
(...)
@Repository("userDao")
public class UserDaoImpl extends AbstractDao<String, User> implements UserDao {
public void save(User user) {
persist(user);
}
public void saveOrUpdate(User user) {
saveOrUpdate(user);
}
(...)
public void saveOrUpdate(User user) {
super.saveOrUpdate(user);
}