2017-01-19 44 views
0

У меня есть веб-приложение Java/Spring, которое работает на Wildfly 10. Я настроил JPA и задавался вопросом, какой общий подход заключается в том, чтобы делать операции обновления и удаления. Скажем, например, httprequest входит в сервер, чтобы показать все подробности о записи Person. Я буду использовать менеджер сущности, чтобы найти эту запись,Обновление объекта с помощью JPA/entityManager

class PersonDao 
{ 
    @PersistenceContent 
    entityManager entityManager 

    public Person findPerson(int id) 
    { 
     assert(id >= 0); //pseudocode 

     Person p = this.entityManager.find(Person.class,id); 

     assert(p != null); //pseudocode 

     return p; 
    } 
} 

Тогда детали этого человека показаны на экране, запрос заканчивается и поток ушел. Записанная запись Person в менеджере сущности больше не доступна в моем коде.

Спустя некоторое время пользователь обновляет новый запрос для обновления возраста человека. В настоящее время в моем классе Dao я снова переписываю запись, поэтому я уверен, что она присутствует в моем контексте персистентности, но она кажется излишней и утомительной. Я хотел бы знать, лучший способ осуществить это:

public void updatePersonAge(int id, int newAge) 
    { 
     assert(newAge >= 0) 

     Person p = this.findPerson(id); 

     p.setAge(newAge); 

     this.entityManager.persist(p); 
    } 
+0

persist не работает для обновлений. Вызов для использования - merge(), и, возможно, даже это избыточно, JPA отслеживает изменения на управляемых объектах и ​​автоматически синхронизирует эти изменения с базой данных. – Gimby

ответ

0

, как вы делаете это правильно, называя

Person p = this.findPerson(id); 

, чтобы получить правильный объект Person (опять же) необходимо обновить его, потому что как вы описали, менеджер объектов больше не имел доступа к объекту Person.

+0

Что касается производительности, действительно ли диспетчер сущности выполняет другой выбор, или он извлекает объект-объект из кеша? – user1884155

+0

В этом случае используется другой выбор. – Nate

1

Как я могу это сделать, это создать PersonRepository вместо PersonDao. "Spring Data JPA for more info."

Это просто, чтобы научиться и устрашать, как только вы это знаете. Ваш Dao теперь будет просто интерфейс, запросы на его основе будет выглядеть примерно так ...

public interface PersonRepository extends JpaRepository<Person, Integer> { 
    //custom queries here... 
} 

Даже если вы ничего не поместите в этом файле теперь имеет conviences из создания, обновления, поиск по идентификатору, и удалить все из JpaRepository.

Я бы тогда создать PersonService для обработки случаев, описанных выше

@Service 
public class PersonService { 

    private PersonRepository personRepository   

    @Autowired 
    public PersonService(PersonRepository personRepository) { 
     this.personRepository = personRepository; 
    } 

    // typically you would have create, findById and other methods here 

    public void updatePersonAge(int id, int newAge) { 
     assert(newAge >= 0) 

     Person p = personRepository.findOne(id); 

     p.setAge(newAge); 

     personRepository.save(p); 
    } 

    // but if you want an easy way to do this and you can 
    // serialize the whole object instead of just get the id you can 
    // simply call and update method 
    public Person update(Person person) { 
     assert(person.getId() != null); 
     return personRepository.save(person); 
    } 

} 

Это предполагает, что вы можете сериализовать объект непосредственно с нового века уже в объекте

Кроме того, это не может быть решение, которое вы ищете, потому что я напрямую не использую диспетчер объектов

+0

Я очень ценю этот вклад, но, прочитав учебник, я думаю, что это слишком много для меня. Я просто новичок в изучении/использовании JPA, поэтому слишком рано добавлять еще один слой абстракции/рамки. Это то, что я снова посмотрю после того, как мне будет комфортно (или раздражено с помощью шаблона) в JPA. Благодаря! – user1884155

+0

Сообщите мне, если вы когда-нибудь захотите примеров! Это похоже на многое, но на самом деле это проще, чем вы думаете, и изучение разных уровней не слишком сложно, я обычно использую шаблон репозитория (Dao), службы (бизнес-логику) и контроллер (остальные конечные точки). Кажется, что много абстракции, но ее приятно разделить проблемы. Я также использую Hibernate/JPA, чтобы превращать сущности непосредственно в таблицы DB. Но если вы все еще просто учитесь и изучаете JPA для личных проектов, вы можете игнорировать то, что я сказал.Легко перегружаться в незнакомые темы и не нужно добавлять лишнюю путаницу. –

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

  • Нет связанных вопросов^_^