【问题标题】:Why hibernate is trying to execute a malformed query?为什么休眠试图执行格式错误的查询?
【发布时间】:2013-12-11 08:34:40
【问题描述】:

我遇到了 Hibernate 4.2.7.SP1 的问题,我不知道是误用还是错误。 我正在使用带注释的休眠,我的代码类似于这两个对象:

第一个对象:

@Entity
@Table(name = "TABLE1")
public class FirstObject { 
   @Id
   @GeneratedValue
   private Long id; // database id

   private SecondOBject secondObject

   //Getters, setters and other stuff here.
}

第二个对象:

@Entity
@Table(name = "TABLE2")
public class SecondObject {
    @Id
    @GeneratedValue
    private Long id; // database id.

    @ElementCollection   
    @CollectionTable(name = "T_MAPTABLE")
    private Map<String, Integer> iAmAHashmap;

    //More maps similar to the previous one, the getters, setters and other stuff.
}

当然很多代码都被省略了,因为我认为这与问题无关。

当我执行测试时,我使用“SecondObject”创建了一个对象“FirstObject”并尝试使用 hibernate 将其持久化,我可以看到 hibernate 正在生成此 sql 代码:

Hibernate:
insert
into
    TABLE2

values
    ( )

如您所见,没有参数,也没有值。因此,启动了一个异常:

 SqlExceptionHelper [main] - [SQLITE_ERROR] SQL error or missing database (near ")": syntax error)

SecondObject 中的地图有值(我已经打印了地图的大小以确保)。但是Hibernate不存储它,并尝试将空参数存储在TABLE2中。

但是,如果我更改 SecondObject 并添加任何参数(即字符串):

@Entity
@Table(name = "TABLE2")
public class SecondObject {
    @Id
    @GeneratedValue
    private Long id; // database id.

    private String dummyText="hello!";

    @ElementCollection   
    @CollectionTable(name = "MAPTABLE")
    private Map<String, Integer> iAmAHashmap;

    //More maps similar to the previous one, the getters, setters and other stuff.
}

Hibernate生成的代码是:

Hibernate:
insert
into
    TABLE2
    (dummyText)
values
    (?)

至少,没有显示错误(但显然地图没有插入)。

我的 hibernate.cfg.xml 中有:

 ....
  <property name="hibernate.hbm2ddl.auto">create-drop</property>
 ....

并且 MAPTABLE 是在执行测试时自动创建的。

那我有两个问题:

为什么 hibernate 试图在没有参数和值的情况下执行查询? 为什么我的地图没有插入? (我在所有只有地图而没有其他参数的类中都有这个错误)。

【问题讨论】:

  • 啊!我正在尝试在 SQLite 数据库中持久化...

标签: java sql hibernate map


【解决方案1】:

我不知道你是否省略了它,因为 FirstObjectSecondObject 是与数据库内的外键的关系,你需要用注释来指定它。您可以在此处找到不同类型关系的示例,并提供示例和进一步说明:http://en.wikibooks.org/wiki/Java_Persistence/Relationships

OneToOne-Relationship 看起来像这样,以便 JPA 知道外键是什么。

@OneToOne
@JoinColumn(name="ID")
private SecondObject secondObject;

集合也是如此:http://en.wikibooks.org/wiki/Java_Persistence/ElementCollection CollectionTable-Annotation 有一个属性 joinColumn 来指定外键关系。

【讨论】:

  • 你是对的。我对这个错误感到困惑,我正在其他地方寻找解决方案。就像我忘记了 JoinColumn 一样简单。
  • 但我还是不明白为什么hibernate会尝试执行格式错误的sql查询。它给我带来了很多困惑!
  • 我猜,因为据我了解您对 SecondObject 的描述,它仅包含一个 id 和集合,其数据在另一个表中。所以除了 id 之外实际上没有任何数据可以插入到表中,但是由于这可能是由数据库生成的,Hibernate/JPA 没有要填充的列,但仍然需要以某种方式创建一个新行才能获得生成的 ID。这将是 JPA 或 SQL 均未涵盖的特殊情况,因为 SecondObject 似乎是 FirstObject 和 SecondObject 的集合之间的无用层。
  • 是的,对我来说很有意义。添加外键后,将是要添加到表中的新数据,因此现在它不是空表,一切正常。再次感谢您的 cmets。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
相关资源
最近更新 更多