на JpaRepository.save (Entity e) e имеет отрицательное значение в качестве первичного ключа в базе данных сервера MS SQL - PullRequest
0 голосов
/ 25 февраля 2019

Когда я делаю JpaRepository.save (Entity e), первичный ключ, сгенерированный с помощью последовательности гибернации, сохраняется как любое случайное значение, обычно начиная с -43 или -42.

Я подпружинен, пружинная загрузкапроект с JPA.

Ниже находится мой файл свойств:

hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect
hibernate.hbm2ddl.auto=validate
hibernate.ejb.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy
hibernate.show_sql=false
hibernate.format_sql=true

Это моя сущность, для которой я звоню сохранить.Имя последовательности - CPU_Responses_Seq уже присутствует в БД

@Entity
@Table(name="CPU_Responses")
public class CPUResponses extends BaseEnity{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(generator="CPUResponseSeq",strategy=GenerationType.SEQUENCE)
    @SequenceGenerator(name="CPUResponseSeq",sequenceName="CPU_Responses_Seq")
    @Column(name = "Response_ID", nullable=false,updatable=false)
    private long responseId;

Это мой класс конфигурации персистентности

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages= {"package path"})
@PropertySource("classpath:application.properties")
public class PersistanceConfiguration {

    @Autowired
    private Environment env;

    public Environment getEnv() {
        return env;
    }

    public void setEnv(Environment env) {
        this.env = env;
    }

    @Bean
    LocalContainerEntityManagerFactoryBean entityManagerFactory() throws NamingException {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource());
        entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
        entityManagerFactoryBean.setPackagesToScan("entity path");

        Properties jpaProperties = new Properties();

        //Configures the used database dialect. This allows Hibernate to create SQL
        //that is optimized for the used database.
        jpaProperties.put("hibernate.dialect", env.getRequiredProperty("hibernate.dialect"));

        entityManagerFactoryBean.setJpaProperties(jpaProperties);

        return entityManagerFactoryBean;
    }

    @Bean
    public DataSource dataSource() throws NamingException {
        JndiObjectFactoryBean bean = new JndiObjectFactoryBean(); 
        bean.setJndiName("java:comp/env/jdbc/CPUDB"); 
        bean.setProxyInterface(DataSource.class);
        bean.setLookupOnStartup(false);
        bean.afterPropertiesSet();
        return (DataSource) bean.getObject();
    }

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

}

Я не знаю, что происходит неправильно.Данные сохраняются в БД, но с отрицательным первичным ключом.Мой секвенсор в БД имеет минимальное значение как ноль, поэтому секвенсор правильный.

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

1 Ответ

0 голосов
/ 25 февраля 2019

Я думаю, что это связано с изменениями, внесенными в Hibernate в их генератор последовательностей, попробуйте добавить

hibernate.id.new_generator_mappings = false или spring.jpa.properties.hibernate.id.new_generator_mappings = false

обратите внимание, что «новый генератор» не совместим с предыдущей версией, поэтому начните с чистой базы данных, чтобы избежать проблем.

...