Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA主键值始终为0_Java_Jpa_Primary Key_Playframework - Fatal编程技术网

Java JPA主键值始终为0

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")

我有一个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")
    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;