Почему объект сущности будет отсоединен после того, как метод вернет его?
Поскольку служба не объявлена транзакционной.
Попробуйте:
@Service
**@Transactional**
public class Service {
@Autowired
private PersonRepository personRepository;
public Person findPersonByName(String name) {
return personRepository.findByName(name); // System.out.println(person.name) -> someone
}
}
или
@Service
public class Service {
@Autowired
private PersonRepository personRepository;
**@Transactional**
public Person findPersonByName(String name) {
return personRepository.findByName(name); // System.out.println(person.name) -> someone
}
}
Чтобы уменьшить количество аннотаций и снизить риск их забвения, вы также можете использовать пользовательскую аннотацию TransactionalService :
**@TransactionalService**
public class Service {
@Autowired
private PersonRepository personRepository;
public Person findPersonByName(String name) {
return personRepository.findByName(name); // System.out.println(person.name) -> someone
}
}
TransactionalService также настроен на откат для BusinessException и его подклассов.
Библиотека, Drombler Commons , является OpenSource и доступна из Maven Central:
<dependency>
<groupId>org.drombler.commons</groupId>
<artifactId>drombler-commons-spring-transaction</artifactId>
<version>1.0</version>
</dependency>
Обратите внимание, что отсоединение сущностей не делает их нулевыми. Вы действительно получаете исключение NullPointerException при доступе к свойству name? Это будет означать, что объект не может быть найден.
Но из вашего примера кода видно, что вы получаете исключение NullPointerException от доступа к неинициализированной службе.
Вам необходимо автоматически подключить службу в приложении класс, чтобы избавиться от NullPointerException:
**// Some spring annotation**
public class App {
**@Autowired**
private Service service;
public void doSomething(){
Person person = service.findPersonByName("someone");
// System.out.println(person.name) -> nullpointerEx
}
}