2011-06-07 135 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。