Как сериализовать свойство коллекции в Hibernate? - PullRequest
0 голосов
/ 07 декабря 2011

Отказ от ответственности: я совершенно новичок в разработке Java.Я сделал много C # и немного NHibernate, но этот мир @Attributes и методов get / set совершенно мне незнаком.

Вопрос: У меня очень простой постоянный объект

@Entity
@Table(name = "ADMIN_SETTINGS")
public class AdminSettings extends ClientEntity {
    @Column(name = "SAMPLE_ID_PREFIX")
    private String sampleIdPrefix;
    @Column(name = "USE_24_Hr_CLOCK")
    private Boolean use24hrClock;

    private Integer[] FieldsForSampleBoxView;
 ...

Отображение последнего поля, с которым я застрял.Это простой список не более 3 целых чисел.Мне не нужна таблица один-ко-многим, мне не нужно агрегировать по ней, мне просто нужно сериализовать коллекцию в поле в БД.В идеале, через что-то понятное человеку, но, честно говоря, мне все равно.

Как мне сделать это?

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

Если оно содержит не более 3 целых чисел, почему бы не сохранить эти три целых числа в трех столбцах? Это, по крайней мере, будет нормализовано и опрошено. Если нет, тогда просто используйте постоянный атрибут String, и проанализируйте эту строку в получателе и преобразуйте в строку в установщике:

@Column(FIELDS_FOR_SAMPLE_VIEW_BOX)
private String fieldsForSampleViewBox;

public void setFieldsForSampleViewBox(Integer[] array) {
    StringBuilder b = new StringBuilder();
    for (int i = 0; i < array.length; i++) {
        if (array[i] != null) {
            b.append(array[i]);
        }
        if (i < array.length - 1) {
            b.append(',');
        }
    }
    fieldsForSampleViewBox = b.toString();
}

public Integer getFieldsForSampleViewBox() {
    if (fieldsForSampleViewBox == null || fieldsForSampleViewBox.length() == 0) {
        return new Integer[0];
    }
    String[] strings = fieldsForSampleViewBox.split(",");
    Integer[] result = new Integer(strings.length());
    for (int i = 0; i < strings.length(); i++) {
        if (!strings[i].equals("") {
            result[i] = Integer.valueOf(strings[i]);
        }
    }
    return result;
}

Вы также можете использовать аннотацию @Lob или аннотацию @Type (type = "serializable") в вашем массиве Integer, но тогда будет использоваться собственная сериализация Java, и она будет более хрупкой и не читаемой.

0 голосов
/ 07 декабря 2011

Кредит переходит на первую ссылку, возвращенную Google для «hibernate persist array»: вам может понадобиться this .По сути, он говорит, что вам нужно подключить свой собственный сериализатор для этого в Hibernate.Поскольку я не специалист по Hibernate, я не знаю, как выразить это в аннотациях.

Гораздо проще, но не так элегантно: вообще не сериализуйте int[], вместо этого держите данные в сериализованномФорма внутри AdminSettings, скажем, в строке с пользовательскими разделителями (тьфу).Или иметь и int[] и сериализованную форму, но это будет стоить больше памяти и больше ЦП для поддержки согласованности между ними.

...