Значение первичного ключа JPA всегда равно 0 - PullRequest
3 голосов
/ 07 июня 2011

У меня есть пост-класс, и он вроде работает, но есть одна проблема: первичный ключ не увеличивается.

@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 in palce ..

Вот как у меня в контроллере:

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

Есть идеи, что вызывает эту проблему?

Ответы [ 2 ]

5 голосов
/ 07 июня 2011

Кажется, вы хотите, чтобы значения первичного ключа генерировались автоматически. В этом случае вам нужно добавить аннотацию @GeneratedValue к атрибуту id в дополнение к аннотации @Id. Поэтому ваш код должен быть:

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

Существует несколько стратегий , доступных для генерации идентификаторов. Вам придется ознакомиться с ними, чтобы решить, хотите ли вы выбрать стратегию на основе TABLE, SEQUENCE или IDENTITY (зависит от того, что поддерживает ваша база данных). Если вы явно выберете стратегию, вместо стратегии AUTO по умолчанию будет использоваться определенная стратегия. Явные стратегические решения, сообщаются в коде как:

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

Без сгенерированных значений значение по умолчанию для целых чисел в Java, т. Е. 0, будет сохранено для столбца post_id. Из-за ограничения первичного ключа у вас не может быть второй строки с тем же ключом, что приведет к описанному сбою.

1 голос
/ 10 октября 2012

Существует несколько стратегий для генерации идентификатора:

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

Если вы хотите, чтобы значения первичного ключа генерировались автоматически, используйте GenerationType.AUTO, это работает с MySQL.

...