2013-05-04 8 views
5

私は次のような状況があるとしましょう:プリミティブのArrayListを単一の列にマップする方法はありますか?

Object Carには価格のArrayListがあり、すべて数字です。 Hibernateでは、すべての価格を1つの列に保存することは可能ですか?私はこれが最初の正規形に違反していることを知っていますが、古典的には一対多や多対多の関係のように別々のテーブルに保存したくない場合があります。

JDOでは、ArrayListをBLOB列に保存することで簡単に実行できます。

有用な関連するSOFの質問:ArrayList of primitive types in HibernateおよびMap ArrayList with Hibernate

どんなアイデアも高く評価されます!

答えて

5

AFAIRでは、Hibernateはネイティブのシリアル化を使用し、結果のバイトを列に格納します。でも、私はそれを行うと、データベース内の価格が読みやすくなり、専用の変換を使用し、少なくともJavaのネイティブシリアル化を必要とせずにデータを使用することはできません。

@Basic 
private String prices; 

public void setPrices(List<Integer> prices) { 
    this.prices = Joiner.on(',').join(prices); 
} 

public List<Integer> getPrices() { 
    List<Integer> result = new ArrayList<Integer>(); 
    for (String s : Splitter.on(',').split(this.prices)) { 
     result.add(Integer.valueOf(s)); 
    } 
    return result; 
} 
+0

右。それは私が考えていたもう一つのことでした。カンマで区切った値などで記述しますが、ハックのように見えます。ネイティブのシリアライゼーションに関連して、これはリストをカラム型にマップすることができなかったので私が試して冬眠したことです。私は試し続けて、それから何が出てくるのか見てみましょう。あなたの答えに感謝します。 –

1

あなたは自分のyoutはを実装することができます配列などのカスタムタイプ:

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/types.html#types-custom

はまた、それらのいくつかは、あなたがHQL where句でそれらの配列を比較してみましょうする限り、いくつかの実装を見つけるのは難しいだろうということではありません。

https://forum.hibernate.org/viewtopic.php?t=946973

は、私は個人的に私はこのような何かをしようと...しかし、今は非常に好奇心旺盛イムだろうと思ったことはありません。

+0

非常に興味深い。私はそれを試してみましょう。ありがとうございました! –

11

私はこれがあなたのエンティティで、それをこのようなものを使用する次に、この

import org.apache.commons.lang3.StringUtils; 
import javax.persistence.AttributeConverter; 
import javax.persistence.Converter; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 
import java.util.stream.Collectors; 
import java.util.stream.Stream; 

@Converter 
public class IntArrayToStringConverter implements AttributeConverter<List<Integer>,String>{ 
    @Override 
    public String convertToDatabaseColumn(List<Integer> attribute) { 
     return attribute == null ? null : StringUtils.join(attribute,","); 
    } 

    @Override 
    public List<Integer> convertToEntityAttribute(String dbData) { 
     if (StringUtils.isBlank(dbData)) 
      return new ArrayList<>(); 

     try (Stream<String> stream = Arrays.stream(dbData.split(","))) { 
      return stream.map(Integer::parseInt).collect(Collectors.toList()); 
     } 
    } 
} 

を行うことができます古い質問ですが、JPAのコンテキストでこれをやろうと、誰のために知って

@Entity 
public class SomeEntity 
{ 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @Column 
    @Convert(converter = IntArrayToStringConverter.class) 
    private List<Integer> integers; 

    ... 
} 

楽しい !!!

+0

良い解決策ですが、これはJPA 2.1以降でのみ利用可能です。 – sp00m

関連する問題