public class StringArrayContainer { private Integer id ; private String [ ] tags ; // . }
public class StringArrayContainer { private Integer id ; private String [ ] tags ; // . }
public class StringArrayContainer { private Integer id ; private String [ ] tags ; // . }
public class StringArrayContainer { private Integer id ; private String [ ] tags ; // . }
public class StringArrayContainer { private Integer id ; private String [ ] tags ; // . }
hibernateが「文字列の配列」タイプのフィールドをデータベースに保存できるようにするには、UserTypeインターフェイスを実装するクラスを作成し、マッピング(hbm.xmlファイル)で参照する必要があります(そして十分です)。
- パブリック クラス StringArrayCustomType は UserType {を 実装します
- // TODO:実装を作成します。
- }
メソッドごとにStringArrayCustomTypeクラスメソッドの実装を記述します。
- sqlTypes-データベース内の列タイプの配列。 私たちの場合、それはCLOBです。
- private static final int [ ] SQL_TYPES = new int [ ] { タイプ 。 CLOB } ;
- @ オーバーライド
- public int [ ] sqlTypes ( ) {
- SQL_TYPESを返します。
- }
- requestedClass-nullSafeGetメソッドによって返されるオブジェクトのタイプ。 この文字列の配列があります。
- @ オーバーライド
- public Class requestedClass ( ) {
- 文字列 [ ]を 返します。 クラス ;
- }
- 等しい-2つの値が等しいかどうかをチェックします。 配列は変更されていないと見なします(Javaでも配列の内容を変更できますが、この場合は管理上禁止しています;-))。したがって、リンクの等価性をチェックするだけです。
- @ オーバーライド
- public boolean equals ( Object x、 Object y ) throws HibernateException {
- return x == y ;
- }
- hashCode -hashCode生成を配列自体に委任します。
- @ オーバーライド
- public int hashCode ( Object x ) throws HibernateException {
- xを返します。 hashCode ( ) ;
- }
- nullSafeGet-データベースから読み取るときにフィールドの値を復元します。
- @ オーバーライド
- public Object nullSafeGet ( ResultSet rs、 String [ ] names、 Object owner ) throws HibernateException、 SQLException {
- 文字列値= ( 文字列 )休止状態。 テキスト nullSafeGet ( rs、names [ 0 ] ) ;
- if ( value == null ) {
- nullを 返し ます 。
- } else {
- 文字列 [ ]配列= StringUtils。 split ( value、 '' ) ;
- for ( int i = 0 ; i <配列の長さ ; i ++ ) {
- 配列[ i ] = WhitespaceEscapeUtil。 unescape (配列[ i ] ) ;
- }
- 配列を返し ます。
- }
- }
- nullSafeSet-データベースに書き込むためにフィールドの値をエンコードします。
- @ オーバーライド
- public void nullSafeSet ( PreparedStatement st、 Object value、 int index ) throws HibernateException、 SQLException {
- if ( value == null ) {
- 休止状態 テキスト nullSafeSet ( st、 null 、index ) ;
- } else {
- 文字列 [ ]配列= ( 文字列 [ ] )値;
- 文字列 [ ] copy = 新しい 文字列 [配列。 長さ ] ;
- for ( int i = 0 ; i <配列の長さ ; i ++ ) {
- copy [ i ] = WhitespaceEscapeUtil。 escape (配列[ i ] ) ;
- }
- 休止状態 テキスト nullSafeSet ( st、StringUtils。join ( copy、 '' ) 、index ) ;
- }
- }
- deepCopy-オブジェクトの完全なコピーを作成します。 配列は変更されないため、興味はありません。
- @ オーバーライド
- public Object deepCopy ( Object value ) throws HibernateException {
- 戻り値;
- }
- isMutable-オブジェクトが変更できる場合、trueを返します。
- @ オーバーライド
- public boolean isMutable ( ) {
- falseを 返し ます 。
- }
- 逆アセンブル -2次キャッシュのストレージに適したビューからオブジェクトを復元します。
- @ オーバーライド
- public Serializable disassemble ( Object value ) throws HibernateException {
- return ( Serializable ) value ;
- }
- assemble-オブジェクトを2次キャッシュへの保存に適した形式に変換します。
- @ オーバーライド
- public Object assemble ( Serializable cached、 Object owner ) throws HibernateException {
- キャッシュされたリターン ;
- }
- replace-変更を新しい値から古い値にコピーします。 配列は変更されないため、興味はありません。
- @ オーバーライド
- public Object replace ( Object original、 Object target、 Object owner ) throws HibernateException {
- 元に戻す
- }
最後に、マッピングファイル(hbm.xml)を更新します。
- <クラス 名 = "StringArrayContainer" テーブル = "コンテナ" >
- <id name = "id" >
- <generator class = "native" />
- </ id >
- <プロパティ 名 = "タグ" 列 = "タグ" タイプ = "StringArrayCustomType" />
- </クラス>
文字列の配列を保存してお楽しみください。
PS 次の記事では 、このフィールドでフィルタリングするための特別な基準を固定します。
______________________