Hibernate 尝试使用@PostConstruct填充数据库时出现问题

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

我试图通过Spring和Hibernate来填充新创建的数据库模式

我的
@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);
}