MySQLデータベースに新しい行を挿入する際に問題があります。私はSpring Boot Data JPAでSpring Bootを使用しています。挿入後にハイバーネーションを選択
MySQLはシーケンスをサポートしていないので、独自のシーケンスジェネレータテーブルを作成することにしました。これは基本的に私がやったことです。
- 自動増分フィールド(自分のテーブルのIDとして使用)を使用する
sequences
テーブルを作成しました。 - 関数
sequences_nextvalue()
が作成され、sequences
テーブルに挿入され、新しい自動インクリメントIDが返されます。 - それから、挿入前にトリガーされた各テーブルでトリガーを作成し、idフィールドを
sequences_nextvalue()
の呼び出しの結果に置き換えました。
これは新しい行を挿入するときに問題なく動作します。すべてのテーブルでユニークなIDを取得しています。私が抱えている問題はJPAエンティティにあります。
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class AbstractBaseClass {
@Id
private Integer id = -1;
...
}
@Entity
public class ConcreteClass1 extends AbstractBaseClass {
...
}
@Entity
public class ConcreteClass2 extends AbstractBaseClass {
...
}
私はそのクラスで私の@Id
列を配置し、InheritanceType.TABLE_PER_CLASS
と@Entity
を使用しましたので、抽象基本クラスから照会できるようにしたいです。また、私はIDを-1に初期化しました。なぜなら、IDはsave()
を私のspring crudリポジトリから呼び出す必要があるからです。私の春のデータCrudRepository
のsave()
関数を呼び出した後
、-1 id
に対して適切にMySQLのトリガーが、新しいIDで返さないsave()
によって返されたエンティティによって置き換えられますが、代わりに-1を保持します。 SQLログを調べた後、新しいIDを取得するために挿入後にselectステートメントが呼び出されず、代わりに元のエンティティが返されます。
@GeneratedValue
を使用していないときにHibnerateに挿入後にエンティティを再選択して新しいIDを取得することはできますか?
ご協力いただきまして誠にありがとうございます。
MySQLはSequence..httpsをサポートしています。//stackoverflow.com/questions/26578313/how-do-i-create-a-sequence-in-mysql – Yogi
'AUTO_INCREMENT'の問題はスコープであるため、各テーブルには重複したIDを持つ' AUTO_INCREMENT'フィールドがあります。一意のIDを複数のテーブルに渡したいのですが、 'SOME_TABLE'にidが1の場合、' ANOTHER_TABLE'にはidが1つもありません。だから基本的に私は複数のテーブルと 'AUTO_INCREMENT'フィールドを共有したい。 – jmw5598
私はすでにこれを動作させていますが、 '@ GeneratedValue'を使用していないので、Hibernateは通常' INSERT'の後に 'SELECT'を実行しませんので、' save () 'を返します。 idはデータベースに正しく格納されています。 – jmw5598