sql >> データベース >  >> RDS >> Oracle

Hibernateで文字列をDBシーケンスにマップする方法

    カスタムIdentifierGeneratorクラスを実装します。ブログ投稿から:

    import java.io.Serializable;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    import org.hibernate.HibernateException;
    import org.hibernate.engine.spi.SessionImplementor;
    import org.hibernate.id.IdentifierGenerator;
    
    public class StringKeyGenerator implements IdentifierGenerator {
    
        @Override
        public Serializable generate(SessionImplementor session, Object collection) throws HibernateException {
            Connection connection = session.connection();
            PreparedStatement ps = null;
            String result = "";
    
            try {
                // Oracle-specific code to query a sequence
                ps = connection.prepareStatement("SELECT TABLE_SEQ.nextval AS TABLE_PK FROM dual");
                ResultSet rs = ps.executeQuery();
    
                if (rs.next()) {
                    int pk = rs.getInt("TABLE_PK");
    
                    // Convert to a String
                    result = Integer.toString(pk);
                }
            } catch (SQLException e) {
                throw new HibernateException("Unable to generate Primary Key");
            } finally {
                if (ps != null) {
                    try {
                        ps.close();
                    } catch (SQLException e) {
                        throw new HibernateException("Unable to close prepared statement.");
                    }
                }
            }
    
            return result;
        }
    }
    

    エンティティPKに次のように注釈を付けます:

    @Id
    @GenericGenerator(name="seq_id", strategy="my.package.StringKeyGenerator")
    @GeneratedValue(generator="seq_id")
    @Column(name = "TABLE_PK", unique = true, nullable = false, length = 20)
    public String getId() {
        return this.id;
    }
    

    Eclipseのバグが原因で、ジェネレーター(seq_id)のエラーが発生する可能性があります )は永続性ユニットで定義されていません。次のようにこれを警告に設定します。

    1. ウィンドウ»設定を選択します
    2. JavaPersistence»JPA»エラー/警告を拡張します
    3. [クエリとジェネレーター]をクリックします
    4. Setジェネレータは永続性ユニットで定義されていません 宛先:Warning
    5. [ OK]をクリックします 変更を適用してダイアログを閉じるには


    1. MySQLでUNIONを使用する場合の「エラー1222(21000):使用されるSELECTステートメントの列数が異なる」を修正

    2. SQLServerのネストされたトランザクションでエラーを処理する方法

    3. データベースインスタンスの状態を監視する方法

    4. mysqlIndexingのパフォーマンスをチェックする方法はありますか