0

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>
Guyb
  • 129
  • 1
  • 1
  • 10
  • at your example you are saving 2 entities. what is the problem? – Apostolos Jul 08 '16 at 11:25
  • Ii insert my 4 - i add the DB Table now that you can see – Guyb Jul 08 '16 at 11:29
  • Are you sure you don't get two contextRefreshed events? And stupid question but did you start the application only once? –  Jul 08 '16 at 11:29
  • What do you expect to happen, and what happens instead? What is saved, what is printed in the logs? Are you sure the table is empty before starting the app? – JB Nizet Jul 08 '16 at 11:30
  • and `StartupDbDataInit Working!!!!!` is logged only once? – Apostolos Jul 08 '16 at 11:30
  • @RC no, with debug and run It insert me duplicate ecah time, And each run the DB drop and create again to be clean.. – Guyb Jul 08 '16 at 11:31
  • @Apostolos No it also duplicate, its seems it calld twice – Guyb Jul 08 '16 at 11:33
  • 1
    ok so find out why it is called twice. it isnt a Hibernate issue then :) – Apostolos Jul 08 '16 at 11:34
  • @Apostolos it is becuse when i chnage it from StartupDbDataInit class to controller I got the same problem – Guyb Jul 08 '16 at 11:35
  • Post the console output from running this. Something has to trigger Your ContextRefreshedEvent event twice. Anyway, Your role name is not marked as unique, thats why Hibernate allow you to insert it twice. – patrykos91 Jul 08 '16 at 11:35
  • 3
    This is a possible duplicate of [Why is my Spring ContextRefreshed event called twice?](http://stackoverflow.com/questions/6164573/why-is-my-spring-contextrefreshed-event-called-twice). – Rae Burawes Jul 08 '16 at 11:36
  • @patrykos91 Ok I adding the log in couple moments – Guyb Jul 08 '16 at 11:36
  • Possible duplicate of [Spring ApplicationListener gets fired twice on webapp](http://stackoverflow.com/questions/27859182/spring-applicationlistener-gets-fired-twice-on-webapp) – patrykos91 Jul 08 '16 at 11:44
  • @RaeBurawes Ok it looks like the problem but i have no Idea how to fix it. Maybe it's silly to ask but how do I fix it? – Guyb Jul 08 '16 at 11:45
  • You most probably have a root spring context, containing that component, and a child context for the MVC part, containing that component, too. Make sure the child context only scans the MVC-related components (controllers, etc.), and the root context scans everything **except** the MVC-related components. Or use a single context. Hard to help more without knowing anything about how you configured Spring. – JB Nizet Jul 08 '16 at 11:46
  • @JBNizet Tanks, you want me to add the configuration files? – Guyb Jul 08 '16 at 11:48
  • Start by trying to understand what happens, trying to fix it by yourself, then provide the configuration if you're stuck. – JB Nizet Jul 08 '16 at 11:53
  • @Guyb, you check for the record before you save the entity. if (getRoleById(id) == null){ //save the entity. } But, I would suggest to you to fix the issue on why the ContextRefreshedEvent is being fired twice. – Rae Burawes Jul 08 '16 at 11:57
  • @JBNizet ok I seround the body ofthe function with "if (event.getApplicationContext().getParent() != null)" and it is now fixed. Thank you! – Guyb Jul 08 '16 at 11:59
  • @RaeBurawes what do you mean? check the record? – Guyb Jul 08 '16 at 12:00
  • @Guyb that's a hacky workaround for a bigger issue. This component should not exist twice. You'll have other issues later if you don't properly fix the issue. – JB Nizet Jul 08 '16 at 12:03
  • @JBNizet each fix wit "if" block is just for current probelm, what is the right solution? – Guyb Jul 08 '16 at 12:05
  • @JBNizet I inerst all the config files if you can see them please – Guyb Jul 08 '16 at 12:12
  • 1
    OK, you seem to have a root context defining everything, and a child context defining no component, but inheriting from the root. So I guess that's fine. I would just not used a context refresh event to do that. Just use an initializing method (i.e. a method annotated with `@PostConstruct`), and do your initialization there. – JB Nizet Jul 08 '16 at 12:18
  • @JBNizet I think i understad, I need to create regular class / Service and inside method with [@PostConstruct] annotated and it will fix it? – Guyb Jul 08 '16 at 12:26
  • 1
    I **think** so, yes. – JB Nizet Jul 08 '16 at 12:27
  • 1
    @JBNizet it is working now and the log looks greate also! thank you for your answer and patience – Guyb Jul 08 '16 at 12:36

1 Answers1

0

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;    
        }    
    }    
}
patrykos91
  • 3,506
  • 2
  • 24
  • 30