Hibernate插入单列表问题

时间:2011-09-26 08:41:17

标签: java hibernate sqlite

我正在使用Hibernate和SQLite数据库。我有以下课程:

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

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

然后我有一个类Author,它扩展了Authority并添加了4或5个字段。 当我尝试保存Author对象时,Hibernate会生成以下请求:

 Hibernate: insert into Authority values ( )

sqlite不喜欢这样。

如果我添加一个虚拟String字段,比如“private String test”并在构造函数中设置此属性,一切正常。

我对休眠很新,所以我不知道如何继续。你有什么想法吗?

编辑:根据要求,编写类的映射:

@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)。

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

2 个答案:

答案 0 :(得分:0)

如果您使用InheritanceType.JOINED您与表相关联的表必须包含与idAuthority相关联的列,并且您与表相关联的表必须包含与idAuthority相关联的列,该列是表格中主要标识符的外键。这是表关系协议所必需的

答案 1 :(得分:0)

尝试覆盖ID。

@Entity
@Table(name="Authors")
@PrimaryKeyJoinColumn(name="idAuthority")
@AttributeOverride(name="idAuthority", column=@Column(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;
    (...)

}