2015-11-06 3 views
0

У меня есть одна проблема. Я создаю базы Reposiotry:Объект обновления транзакции Spring

@Transactional 
public abstract class BaseRepository<T extends AbstractEntity> { 
    public T read(Long id , Class<T> classEntity) { 
     if(id == null || classEntity == null) { 
      throw new NullPointerException(); 
     } 
     T result = entityManager.find(classEntity , id); 
     return result; 
    } 

} 

Также я расширил хранилище от BaseRepository

public abstract class PrepareRepository<T extends AbstractEntity> extends BaseRepository<T> implements PrepareEntity<T> { 
    @Override 
    public T read(Long id, Class<T> classEntity) { 
     return prepare(super.read(id, classEntity)); 
    } 

создать некоторую реализацию PrepareRepository, когда изменение объект после чтения

@Override 
    public User prepare(User entity) { 
     entity.setLogin("some"); 
     return entity; 
} 

Я использую OpenEntityManagerInViewFilter. И этот фрагмент из приложенияContext.xml

<aop:aspectj-autoproxy/> 
    <tx:annotation-driven transaction-manager="transactionManager" /> 
    <tx:annotation-driven proxy-target-class="true" /> 
    <bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager"> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 

И наконец вопрос. В databse у меня есть один пользователь с login = 'AdminUser' и Id = 1. Когда я вызываю метод read-in database, пользователь меняет логин на «some». В журналах я видел запрос на обновление в DataBase. Могу ли я это исправить?

+0

Я не понимаю. Вы извлекаете управляемый объект из базы данных, меняете свой логин и удивляетесь, что выполняется запрос для обновления входа в базу данных? Почему вы изменяете логин объекта, если вы не хотите, чтобы логин был изменен? Это не ошибка, это особенность: управляемые объекты ... управляются: их состояние сохраняется JPA. В этом весь смысл использования ORM. –

+0

Если я изменяю объект вне репозитория, без аннотации Transactional, thats all rights, но я хочу просто подготовить объект для пользователя, без изменения в базе данных. Это невозможно? –

ответ

0

Нет, вы не можете исправить это. Так как есть, что opensessioninviewfilter есть транзакция для него там. Таким образом, ваш лучший выбор - клонирование вашего объекта, прежде чем изменить его.

+0

Я думаю, что то же самое –

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