1

最近、Javaアプリのアカウンティングモジュールを作成しました。

このモジュールは、MYSQLテーブルとINNODBエンジンに基づいています。もちろん、要件の1つは、各請求書の「実行中」のIDです。メソッドとシーケンステーブルを使用してIDを生成しようとしましauto_incrementたが、どちらも同じ問題があります。請求書エンティティを永続化するときにIDが生成されるため、永続化されたエンティティのデータベースへのフラッシュ中にエラーが発生した場合、auto_idがインクリメントされ、一連の請求書に「穴」が生じます。もちろん、この方法を削除して、以前の請求書の最大ID + 1で新しい請求書を割り当てることはできますが、これは悪い習慣だと思います。検証の問題が原因で請求書を保存できない場合があると仮定して、請求書シリーズに穴がないことを確認するために他にどのような方法を使用できますか。

4

3 に答える 3

1

SpringFrameworkには次のようなものがあります

@Transactional(rollbackFor=RuntimeException.class)

したがって、サーバー呼び出しに問題が発生した場合は、すべてをロールバックする必要があります。他のフレームワークにも同様のアプローチがあると確信しています。

于 2012-05-08T08:37:00.387 に答える
0

MySQLのバージョンが5.0.2を超える場合は、テーブル列の値を適切にインクリメントするトリガーを使用してみてください。ただし、データベースに請求書番号の生成を委任することは、ビジネスロジックに関連していると思いますが、失敗した場合に問題が発生する可能性があるため、あまり良い考えではないことを覚えておく必要があります。したがって、コードでプログラムで生成することをお勧めします。

于 2012-05-08T08:49:09.040 に答える
0

それ自体は悪い習慣ではありませんが、テーブルの構造的整合性を保証するために別の「従来の」数値主キー フィールドを用意し、請求書番号用に別のフィールドを用意する価値があるかもしれません。

次に、単純なMAX+1を使用するか、キー テーブルから検索するなど、さまざまなロジックを使用してその請求書番号を入力し、さまざまなタイプの請求書にさまざまな番号付けシーケンスを許可できます。

例えば:

CREATE TABLE `keys` (
    `id` INT NOT NULL auto_increment,
    `type` VARCHAR(10) NOT NULL,
    `prefix` VARCHAR(10) NOT NULL,
    `value` INT(10) NOT NULL DEFAULT 0,
    PRIMARY KEY (`id`)
);

INSERT INTO `keys` (`type`, `prefix`) VALUES
('Sales Receipt', 'SRI'),
('Sales Invoice', 'SIN'),
('Sales Refund', 'SRF');

次に、(疑似)コードで実行できます

Database.BeginTransaction;
NewInvNum = Database.Query("SELECT `value` FROM `keys` WHERE `type` = 'SIN'");
MyInvoice.InvoiceNumber = NewInvNum;
Database.SaveInvoice(MyInvoice);
Database.Query("UPDATE `keys` SET `value` = {0} WHERE `type` = 'SIN'", NewInvNum+1);
Database.CommitTransaction;

複数の請求書が作成中の場合、それらが同じ番号を取得しないように、トランザクション (またはその他の同時実行保護) は重要です。

于 2012-05-08T09:22:45.013 に答える