3

テーブルの行を挿入および更新するために、mysql と休止状態を使用しています。私は saveOrUpdate 呼び出しを使用します。今、テーブルの行を更新しようとすると、例外が発生します。例外は、列 requestTime を null にすることはできないと述べています。列プロパティを NotNull に設定したので、明らかにそうです。

行を追加できました。しかし、さらに2列の値で更新すると、この例外が発生します。

更新するときに、テーブルから行を読み取り、行全体を更新する必要があると想定しています。本当 ?hibernate saveOrUpdate がそれをやってくれることをちょっと期待していました。したがって、新しい行を挿入すると、すべての列のゲッターを持つオブジェクトがあります。しかし、更新すると、主キーと新しい列のゲッターのみを持つオブジェクトがあります。

Transaction txD;
Session session;
session = currentSession();
txD = session.beginTransaction();
session.saveOrUpdate(dataStore);
txD.commit();

例外

749368 [Thread-2] DEBUG org.hibernate.internal.util.EntityPrinter  - com.mcruiseon.carpool.concrete.SubscribeProviderConcrete{acceptedTime=Mon Jul 30 03:39:23 UTC 2012, requestTime=null, subscriberIdentityHash=1218553253, requestIdentity=167093126, subscribedProviderHash=-284086361, isAccepted=true}
749375 [Thread-2] DEBUG org.hibernate.SQL  - update carPoolSubscribedProvider set subscriberIdentityHash=?, requestTime=?, subscribedProviderHash=?, isAccepted=?, acceptedTime=? where requestIdentity=?
749398 [Thread-2] DEBUG org.hibernate.engine.jdbc.spi.SqlExceptionHelper  - Column 'requestTime' cannot be null [n/a]
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'requestTime' cannot be null

select * from carPoolSubscribeProvider

+-----------------+------------------------+---------------------+------------------------+------------+--------------+
| requestIdentity | subscriberIdentityHash | requestTime         | subscribedProviderHash | isAccepted | acceptedTime |
+-----------------+------------------------+---------------------+------------------------+------------+--------------+
| 167093126       | -284086361             | 2012-07-27 16:13:19 | 1218553253             |          0 | NULL         |
+-----------------+------------------------+---------------------+------------------------+------------+--------------+

編集 :

| carPoolSubscribedProvider | CREATE TABLE `carPoolSubscribedProvider` (
  `requestIdentity` varchar(50) NOT NULL DEFAULT '',
  `subscriberIdentityHash` varchar(100) NOT NULL,
  `requestTime` datetime NOT NULL,
  `subscribedProviderHash` varchar(100) DEFAULT NULL,
  `isAccepted` tinyint(1) DEFAULT '0',
  `acceptedTime` datetime DEFAULT NULL,
  PRIMARY KEY (`requestIdentity`),
4

3 に答える 3

2

Hibernate は、null 値を持つ属性を処理する方法を理解できません。次の場合に違いはありません。

  1. 一部の属性が null -> データベースで null に設定する必要があります
  2. 一部の属性が null -> そのような属性を更新すべきではありません。

以前は非 null だった属性の値を null に設定することは、属性の値を変更する必要があることを意味します。

列を更新ステートメントの一部にしない場合は、@Columnアノテーションで updateable 属性を false に設定できます。ドキュメントによると、次のように定義されています。永続化プロバイダーによって生成された SQL UPDATE ステートメントに列が含まれているかどうか

于 2012-07-30T11:51:26.237 に答える
1

テーブル定義を書くと簡単になります。

null以外の列には2つのケースがあります。

  1. 「デフォルト値」があります。
 
    テーブルt1を作成します
    ((
        id整数がnullではなく、
        column1 char not null default'Y'、
        column2 date not null default sysdate、
        column3 varchar2(30)null以外のデフォルトユーザー、
        intcol integer not null default 12
    );

この列をINSERTまたはUPDATEで指定しない場合、Oracleは自動的にデフォルト値をテーブルに配置します。

  1. 「デフォルト値」はありません。
    テーブルt1を作成します
    ((
        id整数がnullではなく、
        column1文字がnullではない、
        column2日付がnullではない、
        column3 varchar2(30)はnullではなく、
        intcolintegerデフォルト12
    );

この列をINSERTまたはUPDATEで指定しない場合、Oracleは自動的にエラーメッセージをスローします。

これはデータベースでnullではないという理論です。Hibernateに行きましょう。

次のような列の注釈を付けることができます。

 insert="false", update="false"

その場合、データベースはデフォルト値を使用しますが、テーブル定義でデフォルトが指定されていない場合、このフィールドの値は常にnullではないはずです。

編集:

これで、「NOTNULL」の列が3つあることがわかります。デフォルトの「requestIdentity」が定義されている列の場合、動的更新またはdynami挿入を使用できます:http ://www.mkyong.com/hibernate/hibernate-dynamic-update-attribute-example/

しかし、それらの残りの部分については、変数に値を入力する必要があります。

private Date requestTime = new Date();

private String subscriberIdentityHash = "someDefaultHashHere";
于 2012-07-30T13:51:06.927 に答える