2011-09-26 94 views
2

我正在使用Hibernate和SQLite数据库。我有以下类:休眠插入单列表问题

@Entity 
@Inheritance(strategy=InheritanceType.JOINED) 
public abstract class Authority { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int idAuthority; 
(...) 

然后,我有一个作者类,它扩展权限并添加4或5个字段。 当我试图保存Author对象时,Hibernate会生成以下要求:

Hibernate: insert into Authority values () 

和SQLite不喜欢这样。

如果我添加一个虚拟的字符串字段,如“私人字符串测试”,并在构造函数中设置此属性,一切工作正常。

我是hibernate的新手,所以我不确定如何继续。你有什么主意吗 ?

编辑:按照要求,Author类的映射:

@Entity 
@Table(name="Authors") 
@PrimaryKeyJoinColumn(name="idAuthority") 
public class Author extends Authority { 

    @Column(name = "firstName") 
    protected String firstName; 
    @Column(name = "lastName") 
    protected String lastName; 
    @Column(name = "alias") 
    protected String alias; 
(...) 
} 

编辑:作为请求(之二),该插入的代码:

public void save(Object data) { 
    currentSession.saveOrUpdate(data); 
} 

没什么特别.. 为了给你更多可能的线索,下面是数据库模式:

create table Authority (idAuthority integer, primary key (idAuthority)) 
create table Authors (alias varchar, firstName varchar, 
lastName varchar, idAuthority bigint not null, primary key (idAuthority)) 

N.B. :在SQLite中,一个主键整数自动设置为AUTO-INCREMENT。

引发的异常,这是一个:

java.sql.SQLException: near ")": syntax error 

请求应该更像:插入管理局值(NULL)让SQLite的做它的自动递增,而不是这种怪异的“插入管理局值( )”。

编辑:这是SqlLite for Hibernate包定义的一个问题。我只是想用HSQLDB,它给了我一个正确的查询:

insert into Authority (idAuthority) values (default) 

(然后失败过,但非常不同的原因:P)。

我不确定是否有解决这个问题的办法......除了使用不同的数据库。

+0

粘贴作者的映射,所以我们可以看到它,谢谢 – ssedano

+0

你能PLZ尝试使'idAuthority'公共(类'Authority')? – Santosh

+0

@Santosh:试过了,但没有奏效。 – Raveline

回答

0

如果使用InheritanceType.JOINED,与类Authority相关联的表必须包含与idAuthority关联的列,并且与类Author关联的表必须包含与idAuthority关联的列,该列是表中颁发Authority的主标识符的外键。这是表关系协会要求

0

尝试覆盖ID。

@Entity 
@Table(name="Authors") 
@PrimaryKeyJoinColumn(name="idAuthority") 
@AttributeOverride(name="idAuthority", [email protected](name="id")) 
public class Author extends Authority { 

    @Column(name = "firstName") 
    protected String firstName; 
    @Column(name = "lastName") 
    protected String lastName; 
    @Column(name = "alias") 
    protected String alias; 
    (...) 

}

+0

也没有工作,但我不确定我是否做得对。重写是在Author类中完成的,对吗? – Raveline

+0

试过这样的方式,它没有工作,它仍然向管理局插入一个空值。 (但我了解到AttributeOverride谢谢你:)) – Raveline