Java 为什么hibernate试图执行格式错误的查询?

Java 为什么hibernate试图执行格式错误的查询?,java,sql,hibernate,map,Java,Sql,Hibernate,Map,我对Hibernate4.2.7.SP1有一个问题,我不知道这是误用还是bug。 我将hibernate与注释一起使用,我的代码类似于以下两个对象: 第一个目标: @Entity @Table(name = "TABLE1") public class FirstObject { @Id @GeneratedValue private Long id; // database id private SecondOBject secondObject //Get

我对Hibernate4.2.7.SP1有一个问题,我不知道这是误用还是bug。 我将hibernate与注释一起使用,我的代码类似于以下两个对象:

第一个目标:

@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.
}
如您所见,既没有参数也没有值。因此,启动了一个例外:

 SqlExceptionHelper [main] - [SQLITE_ERROR] SQL error or missing database (near ")": syntax error)
SecondObject中的贴图具有值(我已经打印了贴图的大小以确保)。但Hibernate不存储它,并尝试在表2中存储空参数

但是,如果我更改第二个对象并添加任何参数(即字符串):

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

我的hibernate.cfg.xml中有:

 ....
  <property name="hibernate.hbm2ddl.auto">create-drop</property>
 ....
。。。。
创建下降
....
执行测试时会自动创建映射表

那么我有两个问题:

为什么hibernate尝试执行没有参数和值的查询?
为什么不插入我的地图?(我的所有类中都存在此错误,这些类只有映射,没有其他参数)

我不知道您是否省略了它,因为FirstObjectSecondObject是与数据库中的外键的关系,您需要使用注释指定它。您可以在此处找到不同类型关系的示例,包括示例和进一步解释:

OneToOne关系看起来是这样的,这样JPA就知道外键是什么

@OneToOne
@JoinColumn(name="ID")
private SecondObject secondObject;
收藏也是如此:
CollectionTable注释有一个属性joinColumn来指定外键关系。

Ah!我正试图在SQLite数据库中持久化…你说得对。我被这个错误弄糊涂了,我在别处寻找解决办法。这就像我忘记了JoinColumn一样简单,但我仍然不明白为什么hibernate试图执行一个格式错误的sql查询。这给我带来了太多的困惑!我猜,因为我理解您对第二个对象的描述,它只包含一个id和集合,它们的数据在另一个表中。因此,除了id之外,实际上没有任何数据要插入到表中,但由于这可能是由数据库生成的,Hibernate/JPA没有要填充的列,但是仍然需要以某种方式创建新行才能获得生成的ID。这是一种特殊情况,JPA或SQL都没有涵盖,因为SecondObject似乎是FirstObject和SecondObject集合之间的无用层。是的,对我来说是有意义的。当添加外键时,将是要添加到表中的新数据,因此现在它不是一个空表,并且一切正常。再次感谢您的评论。
Hibernate:
insert
into
    TABLE2
    (dummyText)
values
    (?)
 ....
  <property name="hibernate.hbm2ddl.auto">create-drop</property>
 ....
@OneToOne
@JoinColumn(name="ID")
private SecondObject secondObject;