我正在将hibernate 3.0的配置从MSSQL更改为MySQL。这已经完成,但Hibernate没有为MySQL生成正确的查询。我还使用MySql方言和Mysql jdbc连接器更新了我的配置文件。我面临的问题是 -
我有一个表只有PK,还有一个列(其他表的FK)。现在,在该表中插入数据时,它会生成类似 -
的查询 插入table_name
默认值
此查询适用于MSSql,但不适用于MySQL。请让我知道任何解决方案。 Hibernate如何为MySQL生成正确的查询?
答案 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>