2013-06-13 3 views
0

У меня есть JPA сущности, как это:Map <String, String> с JPA

@Entity 
@Table(name = "ATTRIBUTE") 
public class Attribute { 

    //ID stuff 

    @Column(name = "NAME", nullable = false) 
    private String name; 

    @Column(name = "VALUE", nullable = false) 
    private String value; 

    //getters and setters 
} 

И другой объект:

@Entity 
@Table(name = "ATTRIBUTE_GROUP") 
public class AttributeGroup { 

    //ID stuff 

    @ElementCollection(fetch = FetchType.LAZY, targetClass = java.lang.String.class) 
    @CollectionTable(name = "ATTRIBUTE") 
    @MapKeyColumn(name = "NAME") 
    @Column(name = "VALUE") 
    private Map<String, String> attributes = new HashMap<>(); 

    public void createAttribute(String name, String value) { 
     Attribute attribute = new Attribute(); 
     attribute.setName(name); 
     attribute.setValue(value); 
     attribute.setAttributeGroup(this); 
     attributes.put(name, value); 
    } 

    public Map<String, String> getAttributes() { 
     return attributes; 
    } 
} 

Мне нужно иметь карту в AttributeGroup лица, которое будет иметь Attribute имя пользователя в качестве ключа и значение Attribute в качестве значения.

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

Как я могу достичь этого в JPA, чтобы иметь карту в AttributeGroup от Attribute имя/значение парного объекта?

Я использую Hibernate через EntityManager.

+0

Обязательно использовать аннотации спящего режима? мы не можем пойти для xml-сопоставления? –

+0

Да, мне нужно придерживаться подхода JPA, спящий режим - это просто реализация, так как мы можем перейти на OpenJPA в будущем. – user2219247

+0

Опубликовать полную трассировку стека исключения и код, вызывающий его. Кроме того, в чем смысл объекта атрибута? Вы, кажется, не используете его. Вы создаете новый атрибут в своем методе, но ничего не делаете с ним. –

ответ

0

Вы не можете хранить элементы в той же таблице, Элементы не имеют идентичности и не будут содержать ни одного из других полей.

Вместо этого вы можете использовать атрибут 1: M или M: M для атрибута, который использует это имя в качестве ключа карты. Затем вы можете напрямую открыть карту с парами имени/атрибута в приложении или создать дополнительные аксессоры, которые в случае необходимости преобразуют карту в карту. Из-за идентичности, возможно, было бы лучше разоблачить и использовать атрибуты напрямую.

Если это нежелательно, использование палитры String/String возможно через коллекцию элементов, но вы не сможете повторно использовать ту же таблицу, что и сущность или другие сопоставления коллекции элементов. Таблице потребуется внешний ключ обратно в AttributeGroup, а также поля для пар имя/значение, что вызовет проблемы при повторном использовании.

Смежные вопросы