Java JPA主键值始终为0
我有一个post类,它可以工作,但有一个问题:主键没有增加Java JPA主键值始终为0,java,jpa,primary-key,playframework,Java,Jpa,Primary Key,Playframework,我有一个post类,它可以工作,但有一个问题:主键没有增加 @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")
@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;
}
}
您知道是什么导致了这个问题吗?您似乎希望自动生成主键值。如果是这种情况,除了
@id
注释外,还需要将@GeneratedValue
注释添加到id
属性。因此,您的代码应该是:
@Id
@Column(name="post_id")
@GeneratedValue
public int id;
可用于生成ID。您必须仔细阅读这些内容,以决定是否要选择基于表
、基于序列
、还是基于身份
的策略(这取决于您的数据库支持什么)。如果明确选择策略,将使用定义策略,而不是默认的自动策略。明确的战略决策,通过以下代码传达:
@Id
@Column(name="post_id")
@GeneratedValue(strategy=SEQUENCE, generator="POST_SEQ")
public int id;
如果没有生成的值,Java中整数的默认值,即0将保留在
post_id
列中。由于主键约束,您不能拥有具有相同键的第二行,从而导致所述故障。有几种策略可用于生成id:
GenerationType.AUTO
GenerationType.SEQUENCE
GenerationType.IDENTITY
GenerationType.TABLE
如果您希望自动生成主键值,请使用
GenerationType.auto
,它与MySQL一起工作。当在查询中保持打开状态时,MySQL不应该自己生成主键吗?有没有办法让JPA在保存一个对象时忽略它,而只用于阅读?我还没有读过你更新的答案。我尝试不使用@GeneratedValue参数,现在它告诉我java.sql.SQLException:Field'post_id'没有默认值
是的,我的sql也可以这样做。创建表时需要为该列指定。是否指自动增量列?如果是这样,您需要选择身份策略。@Sled,不客气。我想指出,自动策略通常会导致选择表策略,因此最好指定所需的策略。
@Id
@Column(name="post_id")
@GeneratedValue(strategy=SEQUENCE, generator="POST_SEQ")
public int id;