21

最近 POSTGRESQL に移行したので、db テーブルに新しいエントリを作成する際に一意に生成されたキーを取得しようとしています。テーブルscreenstableは次のようになります。

CREATE TABLE screenstable
(
  id serial NOT NULL,
  screenshot bytea,
  CONSTRAINT screen_id PRIMARY KEY (id )
)

にデータを挿入するメソッドscreenstableは次のとおりです。

@Autowired NamedParameterJDBCTemplate template;
public int insertImage(ImageBean imageBean){
        String query = "insert into screenstable (screenshot) values (:image)";
        SqlParameterSource data = new BeanPropertySqlParameterSource(imageBean);
        KeyHolder keyHolder = new GeneratedKeyHolder();
        template.update(query, data, keyHolder);
        return keyHolder.getKey().intValue();
    }

そしてImageBean_

import java.util.Arrays;

public class ImageBean {
    private int id;
    private byte[] image;
    @Override
    public String toString() {
        return "ImageBean [id=" + id + ", image=" + Arrays.toString(image)
                + "]";
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public byte[] getImage() {
        return image;
    }
    public void setImage(byte[] image) {
        this.image = image;
    }
}

ただし、コードを実行すると、次の例外が発生します

15:33:20,953 ERROR JsonParseExceptionMapper:15 - org.springframework.dao.InvalidDataAccessApiUsageException: The getKey method should only be used when a single key is returned.  The current key entry contains multiple keys: [{id=3, screenshot=[B@db59df}]
org.springframework.dao.InvalidDataAccessApiUsageException: The getKey method should only be used when a single key is returned.  The current key entry contains multiple keys: [{id=3, screenshot=[B@db59df}]
        at org.springframework.jdbc.support.GeneratedKeyHolder.getKey(GeneratedKeyHolder.java:65)
        at some.project.model.FeedbackDao.insertImage(FeedbackDao.java:20)
        at some.project.rest.FeedsRest.pluginCheck(FeedsRest.java:62)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597).....

POSTGRES で使用すると、同じコードが正常に実行されますMySQLが、キーで失敗します。データ型serialが何らかの形でコードの失敗の原因になっているのでしょうか、それとも主キー機能を正しく使用している可能性がありますか?

ご意見をお聞かせください。

4

3 に答える 3

27

どの列がキーであるかがフレームワークに通知されない場合、テーブルのすべての列がキーとして返されます。

次のように、新しいパラメーターを update メソッドに渡すことで通知できます。

template.update(query, data, keyHolder, new String[] { "id" });

NamedParameterJdbcTemplate.update(sql, paramSource, generatedKeyHolder, keyColumnNames)を参照してください。

于 2014-03-19T22:42:06.260 に答える
0

ざっと見てからの推測... keyHolder.getKey().intValue() は keyHolder.getKey()["id"].intValue() (または同様のもの) である必要がありますか? getKey() 関数は複数のキー (id と image) を持つオブジェクトを返し、intValue() 関数を使用してオブジェクトを int に変換しようとしています。 「getKey()」乾杯、フランチェスコ

于 2013-07-21T12:05:07.820 に答える