2014-12-30 50 views
-2

我是Hibernate和ms sql服务器的新手。Hibernate Ms Sql Server,关键字'public'附近语法不正确

我有错误是这样的:

Log: DEBUG SQL:109 - select opmtnasaba0_.id_opmt_nasabah as id_opmt_1_48_0_, opmtnasaba0_.alamat as alamat2_48_0_, opmtnasaba0_.flag_transfer as flag_tra3_48_0_, opmtnasaba0_.id_opdd_kategori_nasabah as id_opdd_4_48_0_, opmtnasaba0_.jabatan as jabatan5_48_0_, opmtnasaba0_.keterangan as keterang6_48_0_, opmtnasaba0_.ktp_npwp as ktp_npwp7_48_0_, opmtnasaba0_.nama as nama8_48_0_, opmtnasaba0_.id_opmt_instansi as id_opmt13_48_0_, opmtnasaba0_.penanggung_jawab as penanggu9_48_0_, opmtnasaba0_.tgl_lahir as tgl_lah10_48_0_, opmtnasaba0_.tgl_status as tgl_sta11_48_0_, opmtnasaba0_.usia as usia12_48_0_ from public.opmt_nasabah opmtnasaba0_ where opmtnasaba0_.id_opmt_nasabah=?

Error: com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near the keyword 'public'

我jdbc.properties

jdbc.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver 
jdbc.dialect=org.hibernate.dialect.SQLServer2008Dialect 
jdbc.databaseurl=jdbc:sqlserver://localhost\\mssql;databaseName=databaseName 
jdbc.username=username 
jdbc.password=password 

我的配置

@Configuration 
@ComponentScan("com.blah") 
@EnableTransactionManagement 
@PropertySource({"classpath:/jdbc.properties"}) 
public class ApplicationContextConfig implements TransactionManagementConfigurer { 
    @Autowired 
    Environment env; 

    @Override 
    @Bean 
    public PlatformTransactionManager annotationDrivenTransactionManager() { 
     // TODO Auto-generated method stub 
     return txManager(); 
    } 

    @Bean(name = "dataSource") 
    public DataSource getDataSource() { 
     BasicDataSource dataSource = new BasicDataSource(); 
     dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName")); 
     dataSource.setUrl(env.getProperty("jdbc.databaseurl")); 
     dataSource.setUsername(env.getProperty("jdbc.username")); 
     dataSource.setPassword(env.getProperty("jdbc.password")); 

     return dataSource; 
    } 

    private Properties getHibernateProperties() { 
     Properties properties = new Properties(); 
     properties.put("hibernate.show_sql", "true"); 
     properties.put("hibernate.dialect", env.getProperty("jdbc.dialect")); 
     properties.put("hibernate.current_session_context_class", 
       "com.jamkrindo.SyncSuretyBondCabang.config.TransactionAwareSessionContext"); 
     //  properties.put("hibernate.hbm2ddl.auto", "create-drop"); 
     return properties; 
    } 

    @Autowired 
    @Bean(name = "sessionFactory") 
    public SessionFactory getSessionFactory(DataSource dataSource) { 
     LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource); 
     sessionBuilder.addProperties(getHibernateProperties()); 
     sessionBuilder.scanPackages("com.jamkrindo"); 
     return sessionBuilder.buildSessionFactory(); 
    } 

    @Autowired 
    @Bean(name = "transactionManager") 
    public HibernateTransactionManager getTransactionManager(
      SessionFactory sessionFactory) { 
     HibernateTransactionManager transactionManager = new HibernateTransactionManager(
       sessionFactory); 
     //transactionManager.setRollbackOnCommitFailure(true); 
     return transactionManager; 
    } 

    @Bean 
    public PlatformTransactionManager txManager() { 
     return new DataSourceTransactionManager(getDataSource()); 
    } 
} 

我的服务

OpmtNasabah dmn = (OpmtNasabah) dao.get(OpmtNasabah.class, json.getIdOpmtNasabah()); 

吾道

public Object get(Class clazz, Number id) { 
     // TODO Auto-generated method stub 
     return sessionFactory.getCurrentSession().get(clazz, id); 
    } 

我的假设是因为hibernate在table_name之前使用关键字public。

如何解决这个问题?

谢谢。

+0

请粘贴您的代码。 –

+0

请参阅http://stackoverflow.com/questions/14932136/make-hibernate-backquote-all-table-column-names - 这应该解决问题 – user2864740

+0

我解决了问题,在我的域模型中,注释表@Table(名称=“opmt_nasabah”,架构=“公共”),我只是删除架构=“公共”。 –

回答

0

PUBLIC is a SQL Server reserved word and cannot be used as a bare identifier。将它引用为分隔标识符(例如“public”或“public”)或为模式选择其他非保留名称。

Microsoft SQL Server uses reserved keywords for defining, manipulating, and accessing databases. Reserved keywords are part of the grammar of the Transact-SQL language that is used by SQL Server to parse and understand Transact-SQL statements and batches.

Although it is syntactically possible to use SQL Server reserved keywords as identifiers and object names in Transact-SQL scripts, you can [use reserved words only when] using delimited identifiers.

要具有休眠报价的所有标识符,见Make hibernate backquote all table/column names - 然而,这种“解决方案” 可能会丢失为什么公众并不需要对报价列表特定适配器上的更重要的问题。 (难道这是一个错误的方言正在使用?)

除了所有的事情,我可能会使用一个比“公开”作为架构名称更加集中(和较少保留)的名称,以避免类似的问题与其他工具。

相关问题