2017-02-09 7 views
2

Вот Мои многие-ко-многие коллекции:Как сохранить коллекцию многих ко многим в JPA2, если у меня есть только ID?

@ManyToMany 
@JoinTable(name="affiliated_databases", 
     joinColumns= 
     @JoinColumn(name="database_id", referencedColumnName="id"), 
     inverseJoinColumns= 
     @JoinColumn(name="affiliated_database_id", referencedColumnName="id") 
) 
public Set<Database> affiliatedOrgs; 

И в моем методе класса обслуживания У меня есть только идентификаторы этой коллекции. Есть ли хорошее решение для сохранения этой коллекции, не читая ее элементы из базы данных?

Я пытаюсь сделать что-то вроде этого:

for (Long affId: affIds) { 
      Database affDatabase = new Database(); 
      affDatabase.setId(affId); 
      target.getAffiliatedOrgs.add(affDatabase); 
     } 
dao.save(target); 

Это работа, но 1) это выглядит для меня как-то не элегантно; 2) он может создавать ошибки, если этот целевой объект будет где-то использоваться в будущем ... Или, может быть, это хорошее решение, и мои сомнения напрасны?

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

ответ

2

Возможно, вы захотите использовать EntityManager.getReference(). Он создает объект «прокси» объекта, при этом все его свойства лениво выбираются (при необходимости).

Получите экземпляр, состояние которого может быть лениво взято. Если запрошенный экземпляр не существует в базе данных, исключительное исключение EntityNotFoundException генерируется при первом обращении к состоянию экземпляра. (Время выполнения провайдера настойчивости разрешено вызывать EntityNotFoundException при вызове метода getReference.) Приложение не должно ожидать, что состояние экземпляра будет доступно после отсоединения, если только оно не было обращено к приложению, пока диспетчер сущности был открыт.