Hibernate没有为MySQL生成正确的查询

时间:2009-09-25 02:45:49

标签: hibernate

我正在将hibernate 3.0的配置从MSSQL更改为MySQL。这已经完成,但Hibernate没有为MySQL生成正确的查询。我还使用MySql方言和Mysql jdbc连接器更新了我的配置文件。我面临的问题是 -

我有一个表只有PK,还有一个列(其他表的FK)。现在,在该表中插入数据时,它会生成类似 -

的查询

插入table_name默认值

此查询适用于MSSql,但不适用于MySQL。请让我知道任何解决方案。 Hibernate如何为MySQL生成正确的查询?

2 个答案:

答案 0 :(得分:1)

我很确定突出显示的语句在MSSQL和MySQL中都无效 - 或者任何其他数据库: - )

你是否完全确定你已经将方言改为指向MySQL?假设您引用的语句实际上是“INSERT INTO my_table DEFAULT VALUES”,这是MS SQL的有效语法,而不是MySQL。

你可以发布Hibernate记录的实际查询以及实际的MySQL异常吗? 您的Hibernate配置,有问题的实体和表模式的映射也可能有助于诊断问题。

更新(基于澄清):

您提供的配置文件肯定不会被提取。 “DEFAULT VALUES”字符串由Dialect.getNoColumnsInsertString()生成,用于支持它的方言(Sybase,MSSql,Postgres,DB2)。 MySQLDialect使用VALUES()形式。

您可以通过将sessionFactory转换为SessionFactoryImplementor并调用其getDialect()方法来验证代码中实际使用的方言。

答案 1 :(得分:0)

Tr.java - >

@Entity @AccessType("property")
@Table (name="Tr")
public class Tr{


protected int tr_autoID;
protected List<Data> dataObj;

//Parameterized Constructor
public Tr(List<Data> data) {
    this.dataObj = data;
}

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public int getTr_autoID() {
    return tr_autoID;
}

public void setTr_autoID(int tr_autoID) {
    this.tr_autoID = tr_autoID;
}


@OneToMany
@JoinColumn(name="Tr_FK")
public List<Data> getDataObj() {
    return dataObj;
}
public void setDataObj(List<Data> dataObj) {
    this.dataObj = dataObj;
}
}

休眠配置文件 -

<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/cdaapp</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

<property name="configurationClass">org.hibernate.cfg.AnnotationConfiguration</property>

<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<!--  thread is the short name for
  org.hibernate.context.ThreadLocalSessionContext
  and let Hibernate bind the session automatically to the thread
-->
<property name="current_session_context_class">thread</property>
<!-- this will show us all sql statements -->
<property name="hibernate.show_sql">true</property>