2015-06-16 4 views
1

Я хочу знать правильную установку аннотации JPA для обработки столбца IDENTITY MS Server 2008 R2.JPA аннотация для столбца IDENTITY MS SQL Server 2008 R2

MS Server 2008 R2 (окончательная первоначальная версия) не поддерживает SEQUENCE, но IDENTITY дает автоматический прирост, когда я тестировал raw sql.

Однако по JPA я не могу заставить его работать по какой-либо стратегии (IDENTITY, AUTO, TABLE) в аннотации @GeneratedValue, и мне не разрешено изменять схему БД, так как это другие. Я не пытался с SEQUENCE, потому что нет последовательности.

таблицы БД схемы

CREATE TABLE [dbo].[invoice_header](
    [invoice_id] [int] IDENTITY(1,1) NOT NULL, 
    [ApprovalDate] [datetime] NULL, 
    [ApproverUserName] [nvarchar](50) NULL, 
CONSTRAINT [PK_invoice_header] PRIMARY KEY CLUSTERED 
(
    [invoice_id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

JPA Аннотация

@Entity 
@Table(name = "invoice_header") 
public class InvoiceHeader { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name="invoice_id") 
    private Long invoiceId; 

Спящий Ошибка

Hibernate: insert into tbl_acct_textura_invoice_header (invoice_id, ApprovalDate, ApproverUserName) values (null, ?, ?) 
2015-06-16 11:12:24.149 ERROR 7157 --- [tp1024240671-18] o.h.engine.jdbc.spi.SqlExceptionHelper : DEFAULT or NULL are not allowed as explicit identity values. 

It е из-за передачи null в Id. Я мог бы заставить HQL не включать столбец invoice_id во время вставки с помощью insertable = false и updatable = false в аннотации @Column, но затем hibernate не был рад, если не включить столбец Id, как показано ниже. Любое предложение? FYI, я использую JpaRepository пружинными данных

Hibernate ошибки, когда они не включают в себя столбец ID во вставке

nested exception is org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): ...InvoiceHeader 
+1

Поля базы данных IDENTITY должны использовать стратегию «IDENTITY», для чего она предназначена, и работает с DataNucleus, когда я это пробовал. Если Hibernate этого не делает, сообщите об ошибке в отношении них или найдите более новую версию. –

+0

Благодарим вас за ваше предложение, но я обнаружил, что пропустил установочный диалект на LocalContainerEntityManagerFactoryBean –

ответ

1

Я просто нашел, что я пропустил настройки спящего режима говор на LocalContainerEntityManagerFactoryBean. После настройки org.hibernate.dialect.SQLServer2008Dialect как диалоги спящего режима, GenerationType.IDENTITY отлично работает, как упоминал Нил.

Ниже приведена конфигурация параметров моей весны и application.properties. FYI У меня есть несколько источников данных, один из которых является встроенным источником данных H2 для внутреннего использования, а другой - сервером MS SQL 2008 для удаленного доступа к данным, на который у меня была проблема.

конфигурации Spring данных для сервера MS SQL 2008

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(
     entityManagerFactoryRef = "adapterEntityManagerFactory", 
     transactionManagerRef = "adapterTransactionManager", 
     basePackages = {"com.textura.client.erp.database.repository"}) 
public class ErpRepositoryConfig { 
    @Autowired 
    JpaVendorAdapter jpaVendorAdapter; 

    @Value("${adapter.datasource.url}") 
    private String databaseUrl; 

    @Value("${adapter.datasource.username}") 
    private String username; 

    @Value("${adapter.datasource.password}") 
    private String password; 

    @Value("${adapter.datasource.hibernate.dialect}") 
    private String dialect; 

    public DataSource dataSource() { 
     return new DriverManagerDataSource(databaseUrl, username, password); 
    } 
    @Bean(name = "adapterEntityManager") 
    public EntityManager entityManager() { 
     return entityManagerFactory().createEntityManager(); 
    } 

    @Bean(name = "adapterEntityManagerFactory") 
    public EntityManagerFactory entityManagerFactory() { 
     Properties properties = new Properties(); 
     properties.setProperty("hibernate.dialect", dialect); //"org.hibernate.dialect.SQLServer2008Dialect" 
     LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean(); 
     lef.setDataSource(dataSource()); 
     lef.setJpaVendorAdapter(jpaVendorAdapter); 
     lef.setPackagesToScan("com.textura.client.erp.database.model"); 
     lef.setPersistenceUnitName("adapterPersistenceUnit"); 
     lef.setJpaProperties(properties); 
     lef.afterPropertiesSet(); 
     return lef.getObject(); 
    } 

    @Bean(name = "adapterTransactionManager") 
    public PlatformTransactionManager transactionManager() { 
     return new JpaTransactionManager(entityManagerFactory()); 
    } 
} 

application.properties файл в путь к классам

# database configuration 
spring.datasource.url=jdbc:h2:file:~/internal;AUTO_SERVER=TRUE 
spring.datasource.username=sa 
spring.datasource.password= 
spring.datasource.driver-class-name=org.h2.Driver 
spring.datasource.schema=schema.sql 
spring.datasource.data=data.sql 
spring.datasource.initialize=false 
#spring.datasource.initialize=true only for first time to create table, after that switch to false 

# JPA. Hibernate 
spring.jpa.database=H2 
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect 
spring.jpa.hibernate.ddl-auto=create-drop 
#spring.jpa.hibernate.ddl-auto=choose one of [create-drop, create, update, validate, none] 
spring.jpa.hibernate.naming-strategy: org.hibernate.cfg.ImprovedNamingStrategy 
spring.jpa.show-sql=true 
spring.data.jpa.repositories.enabled=true 


# MS SQL Server 2008 datasource 
adapter.datasource.url=jdbc:sqlserver://some.ip.address:1433;databaseName=Remote 
adapter.datasource.username=sa 
adapter.datasource.password=password 
adapter.datasource.hibernate.dialect=org.hibernate.dialect.SQLServer2008Dialect 

После этого я вижу в GenerationType.IDENTITY работает как шарм

Hibernate: insert into invoice_header (ApprovalDate, ApproverUserName) values (?, ?) 
Смежные вопросы