2016-02-22 2 views
0

У меня есть 3 элемента, как это:JPA MapKey с вложенными Атрибуты

public class ItemType { 
    @Id 
    private Long id = null; 
    ... 
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true, mappedBy = "itemTypeVO") 
    @MapKey(name = "company.id") 
    private Map<Long, ItemTypePurpose> purposeHash = null; 
    ... 
} 


public class ItemTypePurpose { 
    @Id 
    private Long id = null; 
    ... 
    @ManyToOne(fetch = FetchType.LAZY, optional = false) 
    @JoinColumn(name = "idcompany") 
    private Company company = null; 
    ... 
} 

public class Company { 
    @Id 
    private Long id = null; 
    ... 
} 

Моя проблема, я хочу, идентификатор компании в качестве ключа моей карты внутри ItemType.

Я могу скомпилировать и развернуть приложение без каких-либо ошибок. Может сохраняться ItemType, и все хорошо подходит для DB. Но когда я верну его, ключ карты «неправильный», я не знаю, какая информация используется, но наверняка это не идентификатор компании. Возможно, идентификатор ItemTypePurpose.

Компания загружается на карту правильно, только ключ карты неверен. Я пытался использовать Google, но ничего не нашел. Может ли какой-либо способ JPA создать мою карту с этим «вложенным атрибутом»?

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

+1

Я подозреваю, что большинство из них просто использовали бы экземпляр компании в качестве ключа карты. – Chris

+0

Может быть решением в зависимости от реализаций equals() и hash() и данных, заполненных внутри вашего объекта, иначе операция «get()» на карте может не вернуть ваш объект ... –

ответ

0

Это точно не решает вопрос, но разрешает мои потребности сейчас.

С дие Идентификатор компании был в таблице ItemTypePurpose, я мог бы изменить MapKey к:

public class ItemType { 
    @Id 
    private Long id = null; 
    ... 
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true, mappedBy = "itemTypeVO") 
    @MapKeyColumn(name = "idcompany", insertable = false, updatable = false) 
    private Map<Long, ItemTypePurpose> purposeHash = null; 
    ... 
} 

Вместо @MapKey, я использовал @MapKeyColumn. @MapKeyColumn(name = "idcore_company", insertable = false, updatable = false состоит в том, чтобы включить «Key Information» ReadOnly и избежать конфликта конфликтов, поскольку тот же столбец используется в ItemTypePurpose для сопоставления Entity.

Не совсем ответ, но «работал вокруг», чтобы решить мои потребности. Это решение не распространяется, если вы хотите, чтобы поле в качестве ключа карты отличалось от идентификатора.

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