Search code examples
javamysqlspringhibernatehibernate-mapping

Spring 4.3.0.RELEASE + Hibernate 5.2.0.Final - Insert duplicate rows each time


Hi, There is a lot of version of this problem but all the wats to fix it are failed. Every time I insert object, it insert me duplicate data

I tried to change the add function with "persist(role)" or "saveOrUpdate(role)" but it is`nt working.

** update: if I add the fucntion "if (event.getApplicationContext().getParent() != null)" it temporary solution.

DB Table:

mysql> select * from role;
+----+------------+
| Id | Name       |
+----+------------+
|  1 | ROLE_USER  |
|  2 | ROLE_ADMIN |
|  3 | ROLE_USER  |
|  4 | ROLE_ADMIN |
+----+------------+
4 rows in set (0.00 sec)

What could be the problem?

Log.log

[08/07/16 02:32:20:020 IDT] INFO http.DefaultFilterChainValidator: Checking whether login URL '/login' is accessible with your configuration [08/07/16 02:32:21:021 IDT] DEBUG internal.StatisticsInitiator: Statistics initialized [enabled=false] [08/07/16 02:32:21:021 IDT] DEBUG internal.TransactionImpl: begin [08/07/16 02:32:21:021 IDT] DEBUG hibernate.SQL: select next_val as id_val from hibernate_sequence for update

[08/07/16 02:32:21:021 IDT] DEBUG hibernate.SQL: 
    update
        hibernate_sequence 
    set
        next_val= ? 
    where
        next_val=?
[08/07/16 02:32:21:021 IDT] DEBUG internal.AbstractSaveEventListener: Generated identifier: 1, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator
[08/07/16 02:32:21:021 IDT]  INFO dao.RoleDAO: RoleEntity saved successfully, RoleEntity Details=com.searcher.entity.RoleEntity@2b55fd75
[08/07/16 02:32:21:021 IDT] DEBUG internal.TransactionImpl: committing
[08/07/16 02:32:21:021 IDT] DEBUG internal.AbstractFlushingEventListener: Processing flush-time cascades
[08/07/16 02:32:21:021 IDT] DEBUG internal.AbstractFlushingEventListener: Dirty checking collections
[08/07/16 02:32:21:021 IDT] DEBUG internal.AbstractFlushingEventListener: Flushed: 1 insertions, 0 updates, 0 deletions to 1 objects
[08/07/16 02:32:21:021 IDT] DEBUG internal.AbstractFlushingEventListener: Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
[08/07/16 02:32:21:021 IDT] DEBUG util.EntityPrinter: Listing entities:
[08/07/16 02:32:21:021 IDT] DEBUG util.EntityPrinter: com.searcher.entity.RoleEntity{Id=1, users=null, Name=ROLE_USER}
[08/07/16 02:32:21:021 IDT] DEBUG hibernate.SQL: 
    insert 
    into
        role
        (Name, Id) 
    values
        (?, ?)
[08/07/16 02:32:21:021 IDT] DEBUG internal.LogicalConnectionManagedImpl: Initiating JDBC connection release from afterTransaction
[08/07/16 02:32:21:021 IDT] DEBUG internal.LogicalConnectionManagedImpl: Initiating JDBC connection release from afterTransaction
[08/07/16 02:32:21:021 IDT] DEBUG internal.JdbcCoordinatorImpl: HHH000420: Closing un-released batch
[08/07/16 02:32:21:021 IDT] DEBUG internal.TransactionImpl: begin
[08/07/16 02:32:21:021 IDT] DEBUG hibernate.SQL: 
    select
        next_val as id_val 
    from
        hibernate_sequence for update

[08/07/16 02:32:21:021 IDT] DEBUG hibernate.SQL: 
    update
        hibernate_sequence 
    set
        next_val= ? 
    where
        next_val=?
[08/07/16 02:32:21:021 IDT] DEBUG internal.AbstractSaveEventListener: Generated identifier: 2, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator
[08/07/16 02:32:21:021 IDT]  INFO dao.RoleDAO: RoleEntity saved successfully, RoleEntity Details=com.searcher.entity.RoleEntity@6e7f73de
[08/07/16 02:32:21:021 IDT] DEBUG internal.TransactionImpl: committing
[08/07/16 02:32:21:021 IDT] DEBUG internal.AbstractFlushingEventListener: Processing flush-time cascades
[08/07/16 02:32:21:021 IDT] DEBUG internal.AbstractFlushingEventListener: Dirty checking collections
[08/07/16 02:32:21:021 IDT] DEBUG internal.AbstractFlushingEventListener: Flushed: 1 insertions, 0 updates, 0 deletions to 1 objects
[08/07/16 02:32:21:021 IDT] DEBUG internal.AbstractFlushingEventListener: Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
[08/07/16 02:32:21:021 IDT] DEBUG util.EntityPrinter: Listing entities:
[08/07/16 02:32:21:021 IDT] DEBUG util.EntityPrinter: com.searcher.entity.RoleEntity{Id=2, users=null, Name=ROLE_ADMIN}
[08/07/16 02:32:21:021 IDT] DEBUG hibernate.SQL: 
    insert 
    into
        role
        (Name, Id) 
    values
        (?, ?)
[08/07/16 02:32:21:021 IDT] DEBUG internal.LogicalConnectionManagedImpl: Initiating JDBC connection release from afterTransaction
[08/07/16 02:32:21:021 IDT] DEBUG internal.LogicalConnectionManagedImpl: Initiating JDBC connection release from afterTransaction
[08/07/16 02:32:21:021 IDT] DEBUG internal.JdbcCoordinatorImpl: HHH000420: Closing un-released batch
[08/07/16 02:32:21:021 IDT]  INFO startup.StartupDbDataInit: ------------------------------------------------------
[08/07/16 02:32:21:021 IDT]  INFO startup.StartupDbDataInit: StartupDbDataInit Working!!!!!
[08/07/16 02:32:21:021 IDT]  INFO startup.StartupDbDataInit: ------------------------------------------------------
[08/07/16 02:32:21:021 IDT]  INFO context.ContextLoader: Root WebApplicationContext: initialization completed in 21485 ms
[08/07/16 02:32:21:021 IDT]  INFO servlet.DispatcherServlet: FrameworkServlet 'searcher': initialization started
[08/07/16 02:32:21:021 IDT]  INFO support.XmlWebApplicationContext: Refreshing WebApplicationContext for namespace 'searcher-servlet': startup date [Fri Jul 08 14:32:21 IDT 2016]; parent: Root WebApplicationContext
[08/07/16 02:32:21:021 IDT] DEBUG internal.TransactionImpl: begin
[08/07/16 02:32:21:021 IDT] DEBUG hibernate.SQL: 
    select
        next_val as id_val 
    from
        hibernate_sequence for update

[08/07/16 02:32:21:021 IDT] DEBUG hibernate.SQL: 
    update
        hibernate_sequence 
    set
        next_val= ? 
    where
        next_val=?
[08/07/16 02:32:21:021 IDT] DEBUG internal.AbstractSaveEventListener: Generated identifier: 3, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator
[08/07/16 02:32:21:021 IDT]  INFO dao.RoleDAO: RoleEntity saved successfully, RoleEntity Details=com.searcher.entity.RoleEntity@5cf357d8
[08/07/16 02:32:21:021 IDT] DEBUG internal.TransactionImpl: committing
[08/07/16 02:32:21:021 IDT] DEBUG internal.AbstractFlushingEventListener: Processing flush-time cascades
[08/07/16 02:32:21:021 IDT] DEBUG internal.AbstractFlushingEventListener: Dirty checking collections
[08/07/16 02:32:21:021 IDT] DEBUG internal.AbstractFlushingEventListener: Flushed: 1 insertions, 0 updates, 0 deletions to 1 objects
[08/07/16 02:32:21:021 IDT] DEBUG internal.AbstractFlushingEventListener: Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
[08/07/16 02:32:21:021 IDT] DEBUG util.EntityPrinter: Listing entities:
[08/07/16 02:32:21:021 IDT] DEBUG util.EntityPrinter: com.searcher.entity.RoleEntity{Id=3, users=null, Name=ROLE_USER}
[08/07/16 02:32:21:021 IDT] DEBUG hibernate.SQL: 
    insert 
    into
        role
        (Name, Id) 
    values
        (?, ?)
[08/07/16 02:32:21:021 IDT] DEBUG internal.LogicalConnectionManagedImpl: Initiating JDBC connection release from afterTransaction
[08/07/16 02:32:21:021 IDT] DEBUG internal.LogicalConnectionManagedImpl: Initiating JDBC connection release from afterTransaction
[08/07/16 02:32:21:021 IDT] DEBUG internal.JdbcCoordinatorImpl: HHH000420: Closing un-released batch
[08/07/16 02:32:21:021 IDT] DEBUG internal.TransactionImpl: begin
[08/07/16 02:32:21:021 IDT] DEBUG hibernate.SQL: 
    select
        next_val as id_val 
    from
        hibernate_sequence for update

[08/07/16 02:32:21:021 IDT] DEBUG hibernate.SQL: 
    update
        hibernate_sequence 
    set
        next_val= ? 
    where
        next_val=?
[08/07/16 02:32:21:021 IDT] DEBUG internal.AbstractSaveEventListener: Generated identifier: 4, using strategy: org.hibernate.id.enhanced.SequenceStyleGenerator
[08/07/16 02:32:21:021 IDT]  INFO dao.RoleDAO: RoleEntity saved successfully, RoleEntity Details=com.searcher.entity.RoleEntity@2fe40fe3
[08/07/16 02:32:21:021 IDT] DEBUG internal.TransactionImpl: committing
[08/07/16 02:32:21:021 IDT] DEBUG internal.AbstractFlushingEventListener: Processing flush-time cascades
[08/07/16 02:32:21:021 IDT] DEBUG internal.AbstractFlushingEventListener: Dirty checking collections
[08/07/16 02:32:21:021 IDT] DEBUG internal.AbstractFlushingEventListener: Flushed: 1 insertions, 0 updates, 0 deletions to 1 objects
[08/07/16 02:32:21:021 IDT] DEBUG internal.AbstractFlushingEventListener: Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections
[08/07/16 02:32:21:021 IDT] DEBUG util.EntityPrinter: Listing entities:
[08/07/16 02:32:21:021 IDT] DEBUG util.EntityPrinter: com.searcher.entity.RoleEntity{Id=4, users=null, Name=ROLE_ADMIN}
[08/07/16 02:32:21:021 IDT] DEBUG hibernate.SQL: 
    insert 
    into
        role
        (Name, Id) 
    values
        (?, ?)
[08/07/16 02:32:22:022 IDT] DEBUG internal.LogicalConnectionManagedImpl: Initiating JDBC connection release from afterTransaction
[08/07/16 02:32:22:022 IDT] DEBUG internal.LogicalConnectionManagedImpl: Initiating JDBC connection release from afterTransaction
[08/07/16 02:32:22:022 IDT] DEBUG internal.JdbcCoordinatorImpl: HHH000420: Closing un-released batch
[08/07/16 02:32:22:022 IDT]  INFO startup.StartupDbDataInit: ------------------------------------------------------
[08/07/16 02:32:22:022 IDT]  INFO startup.StartupDbDataInit: StartupDbDataInit Working!!!!!
[08/07/16 02:32:22:022 IDT]  INFO startup.StartupDbDataInit: ------------------------------------------------------
[08/07/16 02:32:22:022 IDT]  INFO servlet.DispatcherServlet: FrameworkServlet 'searcher': initialization completed in 140 ms

StartupDbDataInit

package com.searcher.startup;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

import com.searcher.dao.EcommerceDAO;
import com.searcher.dao.RoleDAO;
import com.searcher.dao.UserDAO;
import com.searcher.entity.EcommerceEntity;
import com.searcher.entity.RoleEntity;
import com.searcher.service.RoleService;
import com.searcher.service.RoleServiceImp;

@Component
public class StartupDbDataInit implements ApplicationListener<ContextRefreshedEvent>{

    private static final Logger logger = LoggerFactory.getLogger(StartupDbDataInit.class);

    @Autowired
    private RoleService roleService;

    @Override
    public void onApplicationEvent(final ContextRefreshedEvent event) {
        try{
            // Creatinw Role Entity
            RoleEntity roleUser = new RoleEntity();
            RoleEntity roleAdmin = new RoleEntity();

            roleUser.setName("ROLE_USER");
            roleAdmin.setName("ROLE_ADMIN");

            roleService.add(roleUser);
            roleService.add(roleAdmin);
            logger.info("------------------------------------------------------");
            logger.info("StartupDbDataInit Working!!!!!");
            logger.info("------------------------------------------------------");

            // TODO: Swhatever you need here
            }catch (Exception ex){
                logger.info("StartupDbDataInit Failed!!!!!, SellerEntity Details="+ex.getMessage());
                throw ex;
            }
    }
}

RoleEntity.java:

package com.searcher.entity;

import java.util.Set;

import javax.persistence.*;

@Entity
@Table(name = "role")
public class RoleEntity {

    @Id
    @GeneratedValue
    @Column(name="Id")
    private Long Id;

    @Column(name="Name")
    private String Name;

    @ElementCollection(targetClass=UserEntity.class)
    private Set<UserEntity> users;

    public Long getId() {
        return Id;
    }
    public void setId(Long id) {
        this.Id = id;
    }
    public String getName() {
        return Name;
    }
    public void setName(String name) {
        this.Name = name;
    }

    @ManyToMany(mappedBy = "roles")
    public Set<UserEntity> getUsers() {
        return users;
    }
    public void setUsers(Set<UserEntity> users) {
        this.users = users;
    }
}

RoleDAO.java (interface)

package com.searcher.dao;

import java.util.List;

import org.springframework.stereotype.Repository;

import com.searcher.entity.RoleEntity;

@Repository
public interface RoleDAO {
    public void add(RoleEntity role);
    public void edit(RoleEntity role);
    public void deleteById(int id);
    public RoleEntity getRoleById(int id);
    public RoleEntity getRoleByName(String name);
    public List<RoleEntity> getAllRole();
}

RoleDAOImp.java

package com.searcher.dao;

import java.util.List;

import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.searcher.entity.RoleEntity;

@Repository
public class RoleImp implements RoleDAO {

    private static final Logger logger = LoggerFactory.getLogger(RoleDAO.class);

    @Autowired
    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sf){
        this.sessionFactory = sf;
    }

    @Override
    public void add(RoleEntity role) {
        this.sessionFactory.getCurrentSession().saveOrUpdate(role);
        logger.info("RoleEntity saved successfully, RoleEntity Details="+role);
    }

    @Override
    public void edit(RoleEntity role) {
        this.sessionFactory.getCurrentSession().update(role);
        logger.info("RoleEntity updated successfully, RoleEntity Details="+role);
    }

    @Override
    public void deleteById(int id) {
        RoleEntity roleToDelete = getRoleById(id);
        this.sessionFactory.getCurrentSession().delete(roleToDelete);
        logger.info("RoleEntity deleted successfully, RoleEntity Details="+roleToDelete);
    }

    @Override
    public RoleEntity getRoleById(int id) {
        RoleEntity roleReturn = (RoleEntity)this.sessionFactory.getCurrentSession().get(RoleEntity.class, id);

        logger.info("RoleEntity founded successfully, RoleEntity Details="+roleReturn);

        return roleReturn;
    }

    @Override
    public RoleEntity getRoleByName(String name) {
        RoleEntity roleReturn = 
                (RoleEntity)this.sessionFactory.getCurrentSession().createNamedQuery("from role where Name =" + name);

        logger.info("RoleEntity founded successfully, RoleEntity Details="+roleReturn);

        return roleReturn;
    }

    @SuppressWarnings({ "unchecked", "deprecation" })
    @Override
    public List<RoleEntity> getAllRole() {
        List<RoleEntity> roleList = this.sessionFactory.getCurrentSession().createQuery("from role").list();
        logger.info("List<RoleEntity> upload successfully, List<RoleEntity> Details="+roleList.toString());
        return roleList;
    }

}

RoleService.java

package com.searcher.service;

import java.util.List;

import com.searcher.entity.RoleEntity;

public interface RoleService {
    public void add(RoleEntity user);
    public void edit(RoleEntity user);
    public void deleteById(int id);
    public RoleEntity getRoleById(int id);
    public RoleEntity getRoleByName(String name);
    public List<RoleEntity> getAllRole();
}

RoleServiceImp.java

package com.searcher.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.searcher.dao.RoleDAO;
import com.searcher.entity.RoleEntity;

@Service("roleService")
public class RoleServiceImp implements RoleService {

    @Autowired
    private RoleDAO roleDAO;


    public RoleDAO getRoleDAO() {
        return roleDAO;
    }

    public void setRoleDAO(RoleDAO roleDAO) {
        this.roleDAO = roleDAO;
    }

    @Override
    @Transactional
    public void add(RoleEntity role) {

        this.roleDAO.add(role);
    }

    @Override
    @Transactional
    public void edit(RoleEntity role) {
        this.roleDAO.edit(role);
    }

    @Override
    @Transactional
    public void deleteById(int id) {
        this.roleDAO.deleteById(id);
    }

    @Override
    @Transactional
    public RoleEntity getRoleById(int id) {
        return this.roleDAO.getRoleById(id);
    }

    @Override
    @Transactional
    public RoleEntity getRoleByName(String name) {
        return this.roleDAO.getRoleByName(name);
    }

    @Override
    @Transactional
    public List<RoleEntity> getAllRole() {
        return (List<RoleEntity>)this.roleDAO.getAllRole();
    }
}

This is the folowing configuration files:

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
    <display-name>Searcher</display-name>

    <!-- Location of Java @Configuration classes that configure the components that makeup this application -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/appconfig-root.xml</param-value>
    </context-param>

    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>searcher</servlet-name>
        <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value></param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>  

    <servlet-mapping>
        <servlet-name>searcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>  

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!--  
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    -->

    <!--  
    <servlet-mapping>
        <servlet-name>searcher</servlet-name>
        <url-pattern>/welcome.jsp</url-pattern>
        <url-pattern>/welcome.html</url-pattern>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>-->


</web-app>

appconfig-root.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                            http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/context 
                            http://www.springframework.org/schema/context/spring-context.xsd">

    <import resource="appconfig-mvc.xml"/>

    <import resource="appconfig-data.xml"/>

    <import resource="appconfig-security.xml"/>

    <!-- Scans within the base package of the application for @Component classes to configure as beans -->
    <context:component-scan base-package="com.searcher.*"/>

    <!--<context:property-placeholder location="classpath:application.properties"/>-->

</beans>

appconfig-security.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
             xmlns:beans="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
                                http://www.springframework.org/schema/beans/spring-beans.xsd
                                http://www.springframework.org/schema/security
                                http://www.springframework.org/schema/security/spring-security-4.1.xsd">

    <http auto-config="true">
        <intercept-url pattern="/" access="hasRole('ROLE_USER')"/>
        <intercept-url pattern="/welcome" access="hasRole('ROLE_USER')"/>
        <form-login login-page="/login" default-target-url="/welcome" authentication-failure-url="/login?error" username-parameter="username" password-parameter="password"/>
        <logout logout-success-url="/login?logout" />
    </http>

    <authentication-manager alias="authenticationManager">
        <authentication-provider user-service-ref="userDetailsServiceImpl">
            <password-encoder ref="encoder"></password-encoder>
        </authentication-provider>
    </authentication-manager>

    <beans:bean id="userDetailsServiceImpl" class="com.searcher.service.UserDetailsServiceImpl"></beans:bean>

    <beans:bean id="encoder"
          class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
        <beans:constructor-arg name="strength" value="11"/>
    </beans:bean>
</beans:beans>

appconfig-data.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/beans     
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd">


    <!-- Configure the data source bean -->
    <!-- DataSource -->
    <beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <beans:property name="url"
            value="jdbc:mysql://localhost:3306/SearcherDB" />
        <beans:property name="username" value="root" />
        <beans:property name="password" value="root" />
    </beans:bean>

    <!-- Hibernate 5 SessionFactory Bean definition -->
    <beans:bean id="hibernate5AnnotatedSessionFactory"
        class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <beans:property name="dataSource" ref="dataSource" />
        <beans:property name="annotatedClasses">
            <beans:list>
                <beans:value>com.searcher.entity.RoleEntity</beans:value>
                <beans:value>com.searcher.entity.UserEntity</beans:value>
            </beans:list>
        </beans:property>
        <beans:property name="hibernateProperties">
            <beans:props>
                <beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</beans:prop>
                <beans:prop key="hibernate.show_sql">true</beans:prop>
                <beans:prop key="hibernate.format_sql">true</beans:prop>
                <!-- <beans:prop key="hibernate.hbm2ddl.auto">create</beans:prop>  -->
            </beans:props>
        </beans:property>
    </beans:bean>



    <!-- User -->
    <beans:bean id="userDAO" class="com.searcher.dao.UserImp">
        <beans:property name="sessionFactory" ref="hibernate5AnnotatedSessionFactory" />
    </beans:bean>
    <beans:bean id="userService" class="com.searcher.service.UserServiceImp">
        <beans:property name="userDAO" ref="userDAO"></beans:property>
    </beans:bean>

    <!-- Role -->
    <beans:bean id="roleDAO" class="com.searcher.dao.RoleImp">
        <beans:property name="sessionFactory" ref="hibernate5AnnotatedSessionFactory" />
    </beans:bean>

    <tx:annotation-driven transaction-manager="transactionManager" />

    <!-- Configure the transaction manager bean -->
    <beans:bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <beans:property name="sessionFactory" ref="hibernate5AnnotatedSessionFactory" />
    </beans:bean>

</beans>

appconfig-mvc.xml

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/mvc 
                            http://www.springframework.org/schema/mvc/spring-mvc.xsd 
                            http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans.xsd">

    <mvc:annotation-driven/>

    <mvc:resources mapping="/resources/**" location="/resources/"/>

    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basenames">
            <list>
                <value>classpath:validation</value>
            </list>
        </property>
    </bean>

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources 
        in the /WEB-INF/views directory -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass">
            <value>org.springframework.web.servlet.view.JstlView</value>
        </property>
        <property name="prefix">
            <value>/WEB-INF/views/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean> 


</beans>

Solution

  • First,@Column(unique=true) at RoleEntity.Name

    Then You can (ugly options, but quick):

    -catch exception when context is called second time

    -do some boolean fired check

    -try distinguish between what context is refreshed and skip

    @Component    
    public class ApplicationStartup implements   ApplicationListener<ContextRefreshedEvent> {
        private static boolean fired = false;    
        @Override    
        public void onApplicationEvent(final ContextRefreshedEvent event) {    
            if (!fired) {
            //Your db inserts go there    
            System.out.println("Something simple like that, could do the job i think.");    
            fired = true;    
            }    
        }    
    }