2

何らかの理由で、アプリケーション ID からデータベースに挿入すると、常に 0 になります。これは、pgadmin II からコピーされた、Spring セキュリティ認証テーブル ユーザーに使用されるテーブルです。

 id serial NOT NULL,
  username character varying(100),
  password character varying(200),
  groupfk integer,
  CONSTRAINT users_pk PRIMARY KEY (id ),
  CONSTRAINT users_groupfk_fkey FOREIGN KEY (groupfk)
  REFERENCES groups (id) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION

ユーザードメインクラス、関連する ID 部分に次のものがあります。

    @Id
    @Column(name = "id", columnDefinition = "serial")
    @Generated(GenerationTime.INSERT)
    public int getId() {
        return id;
    }

    @ManyToOne
@JoinColumn(name = "groupfk")
public Group getGroup() {
    return group;
}

public void setGroup(Group group) {
    this.group = group;
}

だから私はこのようにユーザーを挿入しています:

User user = new User();
        user.setPassword(password);
        user.setUsername(username);

        Group group = new Group();
        group.setId(usergroup);
        user.setGroup(group);
                dao.saveUser(user);

Dao メソッド impl :

public void save(User user) {
        Session session = sessionFactory.getCurrentSession();
        session.save(user);
    }

だからここに私が得る例外があります:

Could not execute JDBC batch update; SQL [insert into users (groupfk, password, username, id) values (?, ?, ?, ?)]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update

実際のクエリ:

Batch entry 0 insert into users (groupfk, password, username, id) values ('1', '098f6bcd4621d373cade4e832627b4f6', 'test3', '0') was aborted.  Call getNextException to see the cause.

そのため、以前のユーザーを id0で挿入したところ、成功しました。そして、別のものを挿入しようとしましたが、同じIDを持っていたため、このエラーが発生しました。

通常、SQLトラフSQLクライアント(pgadmin)で挿入しようとすると、機能します。これは期待どおりに機能します:

insert into users (username, password, groupfk) VALUES ('test', 'c20ad4d76fe97759aa27a0c99bff6710',1);

したがって、何らかの理由で休止状態が適切にIDを生成しません。真実は、上記のステートメントが機能している場合、それをまったく生成すべきではないということです。

私は何をしますか?

4

1 に答える 1

2

ID はIntegerではなく である必要がありintます。クラスのインスタンスを作成するたびに、値がthis.id0 に初期化されます。Hibernate は、このオブジェクトを既に永続化されているが切断されていると見なします。これは、null ID を持つことで示される一時的なものとして扱われる必要があります。マニュアルの Hibernate オブジェクトの状態に関する説明を参照してください。

するとsession.save(user)、Hibernate は ID が null であることを確認し、オブジェクトが一時的であることを認識し、その ID を生成して保存します。

于 2012-11-15T18:19:25.560 に答える