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

Java 使用Hibernate JDBC连接连接到Azure SQL Server,java,hibernate,azure,jdbc,azure-sql-database,Java,Hibernate,Azure,Jdbc,Azure Sql Database,Hibernate连接与本地postgresql配合良好,它会自动创建表,但当我们想使用Azure SQL Server(Microsoft SQL Server)并更改驱动程序名称等时,我们没有收到任何错误,但它不起作用。(未创建表) jdbc.drivercassname=com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc.databaseurl=jdbc:sqlserver://xxxx.database.windows.net:1433;数

Hibernate连接与本地postgresql配合良好,它会自动创建表,但当我们想使用Azure SQL Server(Microsoft SQL Server)并更改驱动程序名称等时,我们没有收到任何错误,但它不起作用。(未创建表)

jdbc.drivercassname=com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbc.databaseurl=jdbc:sqlserver://xxxx.database.windows.net:1433;数据库=xxxx
密码=xxxx
jdbc.user=xxx@xxxx
encrypt=true
jdbc.hostNameInCertificate=*.database.windows.net
jdbc.loginTimeout=30;
jdbc.dialogue=org.hibernate.dialogue.sqlserverdialogue
com.xxx.entity
${jdbc.dial}
5.
20
60
100

Azure SQL实际上与本地MS SQL Server非常不同,并且有特定的要求


从“无错误”消息中,我是在暗中试探,但请检查您在创建的每个表上是否有聚集索引。这是Azure上的一项要求。

问题在于jdbc连接url中,属性database=test1应该是databaseName=test1。有关这方面的更多详细信息,请阅读和

当连接url中找不到数据库名时,驱动程序会尝试写入主数据库,这在Azure SQL Server中是不允许的

我在SpringHibernate应用程序中通过JDBC驱动程序连接Azure SQL Server时遇到了权限问题,日志如下

2016-02-26 19:22:37.958错误11424---[lication.main()]org.hibernate.tool.hbm2ddl.SchemaExport:hh000389:不成功:创建表用户(id 数字(19,0)标识不为空,电子邮件varchar(255)不为空,名称varchar(255)不为空,主键(id)) 2016-02-26 19:22:37.964错误11424---[lication.main()]org.hibernate.tool.hbm2ddl.SchemaExport:数据库“master”中的创建表权限被拒绝

Azure portal为您提供了自动创建的连接url(非常酷),我得到了一个如下所示

jdbc:sqlserver://dp-test1.database.windows.net:1433;数据库=test1;使用者=admin@dp-测试1;password={your_password_here};加密=真;trustServerCertificate=false;hostNameInCertificate=.database.windows.net;loginTimeout=30*

如您所见,此url中存在问题。属性database=test1应为databaseName=test1。我将向Azure团队更新这方面的信息,希望他们能尽快修复


更改后,我已将本地应用程序连接到Azure SQL Server DB。

@ManuPK提供了正确的建议。您可以共享连接字符串的格式吗?下面是一个示例:jdbc:sqlserver://dp-test1.database.windows.net:1433;databaseName=test1;使用者=admin@dp-测试1;password={your_password_here};加密=真;trustServerCertificate=false;hostNameInCertificate=.database.windows.net;loginTimeout=30;干杯,
见面
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>