我正在使用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)。
我不确定这个问题是否有解决办法......除了使用不同的数据库。
答案 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;
(...)
}