2011-05-16 65 views
4

我想玩一個非常簡單的類的JPA!框架,並與id列有一些問題。問題與ID列和JPA

我的SQL數據庫只有兩列:

CREATE TABLE IF NOT EXISTS `auto` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) 

我的模式是:

@Entity 
@Table(name = "auto") 
public class Auto extends Model{ 

    @Column(insertable = false, updatable = false) 
    public int id; 

    public String name; 

    public Auto(String name){ 
     this.name = name; 
    } 
} 

一切正常,沒有這部分:

@Column(insertable = false, updatable = false) 
    public int id; 

只要我添加public int id;雖然我會得到這個錯誤:A JPA error occurred (Unable to build EntityManagerFactory): Repeated column in mapping for entity: models.Auto column: id (should be mapped with insert="false" update="false")

這就是我已經添加了註解欄的原因,但它不會與工作沒有,現在我越來越:

A javax.persistence.PersistenceException has been caught, org.hibernate.PropertyAccessException: could not set a field value by reflection setter of models.Auto.id

我這種方式測試模型:new Auto("bmw").save(); save()是playframework中模型類的一個方法。

任何人都知道我爲什麼遇到這個問題?謝謝!

回答

7

嗯,試試它沒有id字段。看起來像Playframework自動創建一個Id字段,如果擴展Model類。見here

」 ...... 如果你以前使用過JPA,你知道,每一個JPA實體必須提供一個@Id屬性在這裏,型號超提供了一個自動生成的數字ID,並且在大多數情況下,這是好的。 「 ...」

+1

使用Spring Data JPA並從AbstractPersistable擴展實體時出現同樣的問題@kindofwhat:Thx將我指向正確的方向! – Sal 2012-07-24 00:20:47

2

class Model已經添加了一個類型爲Long的id字段。這與您在類定義中添加的id字段相沖突。

只需從自動刪除id字段,它應該工作。我不確定數據庫中int(11)的定義是否正確,但如果需要,JPA應自動解決此問題。

+1

但在這種情況下,我該如何獲得對象ID?它是否也創建了getter和setter,以及這些如何被調用? – networkprofile 2011-05-16 10:01:49

+0

這是一個公共領域,所以你可以調用'auto.id'並檢索它。 – 2011-05-16 10:05:08

1

該專欄是否應該類似於以下注釋?

@Id 
@GeneratedValue(generator="???_seq",strategy=GenerationType.SEQUENCE) 
2

您遇到的問題與低估您在遊戲框架中獲得的「自由」有關。

ID(您的原始問題)以及獲取者和設置者(您的後續評論)都會自動爲您生成。

id字段來自您正在擴展的Model類,當您在模型中創建公共字段時,會自動生成並使用獲取者和設置者,然後將其稱爲model.field。

儘管所有模型都會爲它們提供Id,但如果它們要做更復雜或有意義的事情,建議使用您自己的自定義ID。

0

如果您需要添加您自己的ID字段(例如,因爲它需要是整數而不是長整數),則可以擴展GenericModel而不是Model。