2011-06-07 63 views
3

我有一個帖子類,它的工作類型,但有一個問題:主鍵不增加。JPA主鍵值始終爲0

@Entity 
@Table(name="posts") 
public class Post extends GenericModel{ 

    @Id 
    @Column(name="post_id") 
    public int id; 

    @Column(name="post_situation") 
    public String situation; 

    @Column(name="post_date") 
    public Date date; 

    @Column(name="post_userid") 
    public int userid; 

    @OneToMany(mappedBy="post", cascade=CascadeType.ALL) 
    public List<Block> blocks; 

    public Post addBlock(String content, int position){ 
     Block b = new Block(this, content, position); 
     b.save(); 

     this.blocks.add(b); 

     this.save(); 
     return this; 
    } 

    public Post(String situation, Date date){ 
     this.situation = situation; 
     this.date = date; 
     this.userid = 2; 
    } 

} 

當我把它叫做第一次在一個空表,它工作正常,但第二次,我得到PersistenceException occured : org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 的POST_ID列始終爲0。任何想法如何解決這一問題?我有。安迪@Id註釋..

這是我在我的控制器:

Post p = new Post("Midden in het middenoosten.", new Date()).save(); 

任何想法什麼導致這個問題呢?

回答

6

您似乎希望自動生成主鍵值。如果是這種情況,除了@Id註釋之外,如果您需要將@GeneratedValue註釋添加到id屬性。因此,您的代碼應爲:

@Id 
@Column(name="post_id") 
@GeneratedValue 
public int id; 

There are several strategies可用於生成ID。您必須仔細閱讀這些內容才能決定是否要選擇基於TABLE的版本,基於SEQUENCE的版本或基於IDENTITY的版本(這取決於您的數據庫支持的版本)。如果您明確選擇策略,則將使用定義策略,而不是默認的AUTO策略。明確的策略決定,在代碼被傳遞爲:

@Id 
@Column(name="post_id") 
@GeneratedValue(strategy=SEQUENCE, generator="POST_SEQ") 
public int id; 

在不生成的值,在Java整數默認值,即0將被持久保存爲post_id柱。由於主鍵約束,你不能有第二行使用相同的密鑰,導致描述失敗。

+0

當它在查詢中保持打開狀態時,mysql不應該能夠自己生成主鍵嗎?有沒有辦法讓JPA在保存對象時忽略它,只用它來閱讀? – networkprofile 2011-06-07 01:31:58

+0

我還沒有看過你的更新答案。我嘗試了沒有@GeneratedValue參數,現在它告訴我'java.sql.SQLException:字段'post_id'沒有默認值' – networkprofile 2011-06-07 01:36:39

+0

是的,我的SQL可以做到這一點。您需要在創建表時指定該列。 – sudmong 2011-06-07 01:36:59

1

有可產生幾種策略ID:

  1. GenerationType.AUTO
  2. GenerationType.SEQUENCE
  3. GenerationType.IDENTITY
  4. GenerationType.TABLE

如果你想在主鍵的值是自動生成的,使用GenerationType.AUTO,它適用於MySQL。