2011-09-26 75 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