2012-01-30 2 views
9

Возможно ли хранить список целых чисел в одном поле соответствующей таблицы сущностей со стандартным JPA 2?JPA: Сохранение списка целых чисел в одном поле

Что-то вроде:

@Entity 
@Table(name="tbl_myentities") 
public class MyEntity { 

    @ElementaryCollection 
    @Column(name="vals") // in table tbl_myentities 
    private List<Integer> vals; 

Благодаря

ответ

6

Это не представляется возможным хранить несколько значений в одном поле. В чем причина их хранения в одном поле?

Способ может быть использовать поле типа String, и добавить все целые числа там через запятую и присоединиться/взрываются в добытчиками и сеттеров:

private String vals; 

public setVals(int vals[]) 
{ 
    // this.vals = Iterate vals[] and create a comma separated string 
} 

public int[] getVals() 
{ 
    // vals.split(",") to get a list of Strings, then typecast/parse them to ints before returning 
} 

Использование @ElementCollection аннотацию и @CollectionTable, чтобы контролировать отображения требует отдельной таблицы для хранения значений в.

@ElementCollection 
private Collection<Integer> integers; 

подробнее о коллекции элементов на на http://en.wikibooks.org/wiki/Java_Persistence/ElementCollection

Аналогичный вопрос здесь Does JPA @ElementCollection annotation always produce an one-to-many relationship?

+1

В нем говорится: «Значения ElementCollection всегда хранятся в отдельной таблице». –

+0

Я не думаю, что это то, чего хотел ОП. – Kent

1

Я не думаю, что это возможно. Потому что вы не можете иметь столбец в таблице базы данных, который позволяет вам хранить список целых чисел.

Что вы можете сделать, это использовать поле типа строки вместо списка целых чисел -

@Column(name="vals") // in table tbl_myentities 
private String vals; 

И сделать преобразование в строку из списка целых чисел и обратно вручную, прежде чем сохранить сущность и после того, как вы прочитали вашей организации.

1

Возможно, вам понравился @Lob? (Несмотря на то, что это подразумевает)

@Lob 
ArrayList<String> vals; 

(обратите внимание, что ваша коллекция должна быть явно ArrayList)

+0

@Wingie Является ли ваш getter/setter явно для ArrayList? –

1

Вы можете хранить все Vals в поле String, разделенных запятой, и изменения, связанные геттер и сеттер например:

public List<Integer> getVals() { 
    List<Integer> lstVals = new ArrayList<Integer>(); 
    int val = 0; 

    for(String field : this.vals.split(",")) { 
     try { 
      val = Integer.parseInt(field); 
     } 
     // If the String contains other thing that digits and commas 
     catch (NumberFormatException e) { 
     } 
     lstVals.add(val); 
    } 

    return lstVals; 
} 

public void setVals(List<Integer> vals) { 
    String newVals = ""; 
    for(int i : vals) { 
     newVals.concat(String.valueOf(i)); 
    } 
    this.vals = newVals; 
} 
Смежные вопросы