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

自動インクリメントされた複合IDシーケンスをHibernateでマッピングする際の動作を説明する

    id以降 フィールドはすでに一意であり、自動インクリメントされます。この場合、複合IDは必要ないため、エンティティは次のようになります。

    @Id
    @Column(name = "id")
    public long getId() {
        return id;
    }
    
    @Column(name = "subid")
    public int getSubid() {
        return subid;
    }
    

    エンティティは、エンティティマネージャを使用してIDでフェッチできます:

    entityManager.find(MyEntity.class, entityId); 
    

    または、idの両方を取得するクエリを使用してエンティティをフェッチすることもできます およびsubid

    MyEntity myEntity = entityManager.createTypeQuery("select me from MyEntity where id = :id and subid = :subid", MyEntity.class)
        .setParameter("id", entityId) 
        .setParameter("subid", entitySubId) 
        .getSingleResult();
    

    HibernateにはSelectGenerator もあります これは、データベース列からIDをフェッチできます。これは、データベースがトリガーを使用してIDを生成する場合に役立ちます。

    残念ながら、複合IDでは機能しないため、独自の拡張SelectGeneratorを作成する必要があります。 または、単一の文字列id_sub_idを使用します IDとサブIDを1つのVARCHAR列に結合する列:

    '1-0'
    '1-1'
    '2-0'
    '2-1' 
    

    データベース固有のストアドプロシージャを使用して2つの列を更新し、2つの列をVARCHARに集約するデータベーストリガーを作成する必要があります。次に、標準のSelectGeneratorを使用して集計列をマップします 文字列フィールドへ:

    @Id
    @Column(name = "id_sub_id")
    @GeneratedValue( strategy = "trigger" )
    @GenericGenerator( 
        name="trigger", strategy="org.hibernate.id.SelectGenerator",
        parameters = {
            @Parameter( name="keys", value="id_sub_id" )
        }
    )
    public String getId() {
        return id;
    }
    


    1. MAKEDATE()の例– MySQL

    2. SQLで2つの列を乗算する方法

    3. パラメータ宣言でvarchar(MAX)にどのサイズを使用しますか?

    4. MySQL / MariaDBでrootと同じ権限を持つユーザーを作成するにはどうすればよいですか?