2013-09-27 3 views
1

Не удалось сохранить карту, если String не является ключом к отображению Entity? Например:JPA: Сохранение карты <String, Entity>

class A { 

    @Id 
    long id; 

    String code; 
} 

class B { 

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) 
    @What magical combination of JPA annotations should I use here?! 
    Map<String,A> mapAByCode; 

} 

Я пытался много комбинаций {@ JoinTable, @ MapKeyColumn, @ JoinColumn, @ JoinTable} аннотаций без успеха, и я схожу с ума ...

Благодаря!

+0

Почему MapKeyColumn не работает? Посмотрите http://wiki.eclipse.org/EclipseLink/Examples/JPA/2.0/MapKeyColumns для справки – Chris

+0

@MapKeyColumn (name = "CODE") создает поле (с именем «CODE»), которое отображает первичный ключ id. @MapKeyColumn (name = "A_CODE") тоже не работает – acimutal

+0

MapKeyColumn определяет поле, используемое в таблице отношений, для хранения значения ключа. Он используется для дополнительной информации. Все, что вам кажется нужным, - это хеш ваших объектов на карте, основанных на значении A.code. – Chris

ответ

0

Поскольку вы, похоже, хотите отображать объекты, используя значение A.code, @MapKey - это то, что вам нужно. @MapKey позволяет вам определить значение в ссылке для использования в качестве ключа для карты. Поскольку состояние javadoc, оно должно быть уникальным, хотя или вы столкнетесь с проблемами.

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) 
    @MapKey(name="code") 
    Map<String,A> mapAByCode; 
+0

Я не знаю, что происходит. Использование данных карты @MapKey (name = "code") неверно десериализовано: ключи карты, которые я получаю, являются идентификаторами вместо кодов A. – acimutal

0

кажется, что проблема связана с другой картой я использую в том же классе:

@Entity 
class A { 

    @Id 
    long id; 

    String code; 
} 

@Entity 
class B { 

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) 
    @JoinTable(name = "B_MAPABYID", joinColumns = @JoinColumn(name = "B_ID")) 
    @MapKey(name="id") 
    Map<Long,A> mapAById; 

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) 
    @JoinTable(name = "B_MAPABYCODE", joinColumns = @JoinColumn(name = "B_ID")) 
    @MapKey(name="code") 
    Map<String,A> mapAByCode; 

} 

Эта конфигурация не работает для меня, но если я устанавливаю mapAById, как преходящее все работы хорошо. Имеет ли это смысл для вас?

+0

Поскольку я не мог решить проблему, я решил изменить карту на карту mapAidByCode и взять экземпляры A в шаги mapAById.get (mapAidByCode.get ("code1")). Я просто определяю эту карту основных типов с помощью простой аннотации @ElementCollection. – acimutal

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