【问题标题】:why we need to define dilect,when we have already defined driver in configuration file in hibernate为什么我们需要定义dilect,当我们已经在hibernate的配置文件中定义了驱动程序时
【发布时间】:2016-11-01 21:30:37
【问题描述】:

many的文档中我发现我们必须在hibernate.cfg.xml中定义方言来告诉hibernate我们将使用什么语言或hibernate。在此基础上hibernate生成相应的sql。

<property name="hibernate.conection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.dilect">org.hibernate.dialect.MySQLDilect</property>

除此之外,任何数据库提供程序都可能有多个驱动程序,而且任何驱动程序都可能根据其版本有多种方言。

我的意思是,即使我们已经在那里提到了驱动程序(唯一),而且我们是单一版本的 jar,那么为什么这不仅足以生成 sql。

【问题讨论】:

    标签: java hibernate hibernate.cfg.xml


    【解决方案1】:

    方言是可选的配置选项。通常hibernate可以根据数据库连接自动检测方言。

    但在某些情况下,您可能需要不同的方言 - 不同版本的数据库可能需要不同的方言。 - 自定义/修正一种方言并指定它。

    【讨论】:

    • 我同意各个数据库提供商的每个版本的方言可能不同,但在应用程序中你不能使用不同的版本。
    【解决方案2】:

    您是否假设驱动程序是唯一的并且可用于确定要连接的数据库?好吧,您可以拥有许多支持同一数据库的驱动程序类。可能对于 MySQL现在有一个通用驱动程序,但请考虑 Oracle。

    Oracle 有许多驱动程序。检查这个http://www.oracle.com/technetwork/java/index-136695.html

    如果 Hibernate 必须使用您指定的任何一种可能的驱动程序,它如何知道要使用哪种方言(SQL 语法)?所以你需要同时指定 Driver 类和 Dialect 来休眠。

    【讨论】:

    • 是的,一个数据库可能有多个驱动程序,但是为什么选择其中任何一个都不足以生成相应的sql。
    【解决方案3】:

    连接驱动类仅指出数据库管理系统(DBMS)供应商。因为一个 DBMS,供应商有很多版本,每个版本都有一组特定的功能。到那时,每个 DBMS 添加更多功能。例如:

    甲骨文

    Oracle 8i(1999 年发布)使用org.hibernate.dialect.Oracle8iDialect

    Oracle 9i(2001 年发布)使用org.hibernate.dialect.Oracle9iDialect

    Oracle 10g(2003 年发布)使用org.hibernate.dialect.Oracle10gDialect

    Oracle 11g(2007 年发布)使用org.hibernate.dialect.Oracle10gDialect

    Oracle 12c(2013 年发布)使用org.hibernate.dialect.Oracle12cDialect

    这是当前版本方言的完整列表: https://docs.jboss.org/hibernate/orm/current/javadocs/org/hibernate/dialect/package-summary.html

    【讨论】:

    • 我正在使用 12c 版本中提供的驱动程序,我可以在不更改 jars/mavem 依赖项的情况下将我的 dilect 切换到 11g 吗?
    • 检查您使用的 Oracle 数据库版本。那么,方言就跟随着这个版本了。
    猜你喜欢
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2015-07-10
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    相关资源
    最近更新 更多