2016-09-10 1 views
0

Я использую данные Spring JPA, hibernate, sqlserver в приложении Spring Rest.Объект спящего режима обновляет существующую строку вместо создания новой строки с помощью saveAndFlush

i) Для первого запроса запись вставляется в базу данных. работая до этого.

II), когда я сделать еще один новый запрос с новыми данными обновления существующей записи вместо вставки новой записи в базу данных

III) Но когда контекст приложения перезагружается я могу вставить новую запись.

Ниже приведен фрагмент кода.

1) Hibernate конфигурации

public class HibernateConfiguration { 

@Autowired 
private Environment env; 

@Bean 
public DataSource dataSource() { 
    DriverManagerDataSource dataSource = new DriverManagerDataSource(); 

    dataSource.setDriverClassName(env.getRequiredProperty 
     ("db.driverClassName")); 
    dataSource.setUrl(env.getRequiredProperty("db.url")); 
    dataSource.setUsername(env.getRequiredProperty("db.username")); 
    dataSource.setPassword(env.getRequiredProperty("db.password")); 

    return dataSource; 
} 

@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { 
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 
    entityManagerFactoryBean.setDataSource(dataSource); 
    entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); 
    entityManagerFactoryBean.setPackagesToScan(new String[] { my.domains.package }); 

    entityManagerFactoryBean.setJpaProperties(hibProperties()); 

    return entityManagerFactoryBean; 
} 

private Properties hibProperties() { 
    Properties properties = new Properties(); 
    properties.put("hibernate.dialect", env.getRequiredProperty("hibernate.dialect")); 
    properties.put("hibernate.show_sql", env.getRequiredProperty("hibernate.show_sql")); 
    properties.put("hibernate.hbm2ddl.auto", env.getRequiredProperty("hibernate.hbm2ddl.auto")); 
    return properties; 
} 

@Bean 
public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { 
    JpaTransactionManager transactionManager = new JpaTransactionManager(); 
    transactionManager.setEntityManagerFactory(entityManagerFactory); 
    return transactionManager; 
} 

2) домен

@Entity 
@Table(name="Emp_Detetail") 
public class EmpDetail implements java.io.Serializable { 

private static final long serialVersionUID = 7342724430491939936L; 

@Column(name="EmployeeId") 
@Id 
@GeneratedValue 
private int employeeId; 

    ....... 
} 

3) JPA Respository

public interface EmpDetailRepository extends JpaRepository<EmpDetail, Integer> {  

    } 

4) DAO

@Repository("empDetailDao") 
public class EmpDetailDaoImpl implements EmpDetailDao { 

    @Resource 
    private EmpDetailRepository empDetailRepository; 

    @Override 
    @Transactional 
    public EmpDetail insertEmpDetails(EmpDetail empDetail) { 
    return empDetailRepository.saveAndFlush(archive); 
    } 
} 

5) Класс обслуживания

@Service 
public class EmpDetailServiceImpl implements EmpDetailService{ 

    @Autowired 
    private EmpDetailDao empDetailDao; 

    @Autowired 
    private EmpDetail empBO; 

private EmpDetail toInsertEmpDetails(int active, String empName) throws 
    Exception { 
    empBO.setName(empName); 
    empBO.setActive(active); 
    empBO = empDetailDao.insertEmpDetails(empBO); 
    } 
    return empBO; 
} 

6) код Контроллер

@RestController 
public class EmpDeatilController { 

    @Resource 
    private EmpDetailService empDetailService; 

    @RequestMapping(value = "/insertEmpDetail", method = 
    RequestMethod.GET) 
    @ResponseBody 
    public EmpDetialResponse insertEmpDetail(@RequestParam("empName") String 
    empName, @RequestParam("active") int active) throws Exception{ 

    return empDetailService.toInsertEmpDetails(active, empName); 
    } 

} 

Пожалуйста, помогите мне.

Заранее спасибо

ответ

1

При вставке первой записи, вы сохраните вставленный объект в поле

@Autowired 
private EmpDetail empBO; 

в EmpDetailServiceImpl боба. Поскольку это одноэлементный компонент, когда вы делаете дальнейшие вызовы метода toInsertEmpDetails, он будет использовать сохраненный объект, обновить его имя и активный флаг и сохранить это. Поскольку этот объект уже имеет идентификатор (с вашего первого вызова), он будет обновлять запись в базе данных, а не создавать новую. Чтобы решить эту проблему, просто удалите поле empBO, как правило, нет необходимости иметь такое поле в сервисе (которое должно быть без гражданства).

+0

спасибо за ответ, но я не понимаю, что вы подразумеваете под удалением поля, это удаление переменной экземпляра и объявление локальной переменной или удаление Autowired Annotation из кода. – mbf

+0

Удалите переменную экземпляра и используйте только локальную переменную. – dunni

+0

Я пробовал, но без изменений – mbf

Смежные вопросы