使用Hibernate JDBC连接连接到Azure SQL Server

3

Hibernate连接本地PostgreSQL时运行良好,并自动创建表,但当我们想要使用Azure SQL Server(Microsoft SQL Server)并更改驱动程序名称等时,我们没有收到任何错误消息,但未能正常工作(未创建表)。

jdbc.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbc.databaseurl=jdbc:sqlserver://xxxx.database.windows.net:1433;database=xxxx
jdbc.password=xxxx
jdbc.user=xxx@xxxx
jdbc.encrypt=true
jdbc.hostNameInCertificate=*.database.windows.net
jdbc.loginTimeout=30;
jdbc.dialect=org.hibernate.dialect.SQLServerDialect

<bean id="propertyConfigurer"
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
      p:location="/WEB-INF/jdbc.properties" >
</bean>

<bean id="dataSource"
    class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
    p:driverClassName="${jdbc.driverClassName}"
    p:url="${jdbc.databaseurl}" p:username="${jdbc.user}"
    p:password="${jdbc.password}">
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="packagesToScan">
        <list>
            <value>com.xxx.entity</value>
        </list>
    </property>

    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${jdbc.dialect}</prop>
            <prop key="hibernate.c3p0.min_size">5</prop>
            <prop key="hibernate.c3p0.max_size">20</prop>
            <prop key="hibernate.c3p0.idle_test_period">60</prop>
            <prop key="hibernate.c3p0.max_statements">100</prop>
            <!--<prop key="hibernate.hbm2ddl.auto">${database.hbm2ddl.auto}</prop>-->
            <!--<prop key="hibernate.show_sql">${database.show_sql}</prop>-->
            <!--<prop key="hibernate.format_sql">${database.format_sql}</prop>-->
        </props>
    </property>
</bean>

1
@ManuPK的建议很正确。你能分享一下连接字符串的格式吗?这是一个例子:jdbc:sqlserver://dp-test1.database.windows.net:1433;databaseName=test1;user=admin@dp-test1;password={your_password_here};encrypt=true;trustServerCertificate=false;hostNameInCertificate=.database.windows.net;loginTimeout=30;祝好, <br>Meet - meet-bhagdev
2个回答

2
问题在于jdbc连接url中,属性database=test1应该改为databaseName=test1。阅读JDBC规范SQL Server Driver规范以获取更多详细信息。
当连接url中找不到databaseName时,驱动程序尝试写入master数据库,在Azure SQL Server中是不允许的。
我在使用以下日志记录的spring hibernate应用程序中通过JDBC驱动程序连接到Azure SQL Server时遇到了权限问题。
2016-02-26 19:22:37.958 错误 11424 --- [lication.main()] org.hibernate.tool.hbm2ddl.SchemaExport:HHH000389: 失败:创建表users(id numeric(19,0)identity not null,email varchar(255)not null,name varchar(255)not null,primary key(id))。 2016-02-26 19:22:37.964 错误 11424 --- [lication.main()] org.hibernate.tool.hbm2ddl.SchemaExport:在数据库'master'中拒绝创建表。

Azure门户为您提供了自动创建的连接URL(非常酷),我得到了以下一个:

jdbc:sqlserver://dp-test1.database.windows.net:1433;database=test1;user=admin@dp-test1;password={your_password_here};encrypt=true;trustServerCertificate=false;hostNameInCertificate=.database.windows.net;loginTimeout=30;*

正文翻译:如您所见,这个URL存在一个问题。属性database=test1应该是databaseName=test1。我会向Azure团队报告此问题,希望他们能尽快解决它。
经过更改后,我的本地应用程序已成功连接到Azure SQL Server数据库。

0

Azure SQL与本地MS SQL Server实际上有很大的区别,并且具有特定的要求。

从没有错误消息中,我猜测您需要检查每个被创建表格上是否有聚集索引。这是Azure的要求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接