Я просто пытаюсь создать веб-приложение CRUD с помощью Spring Boot и обнаружил, что существует проблема с использованием Java Double Brace Initialization в структуре.
Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Unknown entity: com.example.service.impl.FileImageServiceImpl$1; nested exception is java.lang.IllegalArgumentException: Unknown entity:
У меня класс @Entity
:
@Entity
public class RandomEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
//Getter and Setter
}
@RestController
@RestController
public class RandomController{
@Autowired
private RandomRepository randomRepository;
@GetMapping("/create")
public String create(){
RandomEntity rdEntity = new RandomEntity(){{
setName("Bla Bla");
}};
return randomRepository.save();
}
}
Вот репозиторий
public interface RandomRepository extends CrudRepository<RandomEntity, Long> {
}
Но когда я меняю инициализацию двойной скобки Java на нормальную инициализацию, приложение запускается правильно.
Вы знаете почему? Большое спасибо!
Это может выглядеть как изящный ярлык, который просто вызывает конструктор вашего класса, за которым следуют некоторые методы инициализации для созданного экземпляра, но на самом деле так называемый инициализация двойных скобок действительно делает создать подкласс вашего класса Entity. Hibernate больше не будет знать, как с этим бороться.
Так что постарайтесь этого избежать. У него много накладных расходов и ошибок, чтобы сэкономить вам несколько нажатий клавиш.
Большое спасибо! Теперь у меня достаточно поводов, чтобы поблагодарить. У меня вопрос, откуда вы это знаете?
Я просто хочу завершить ответ @Thilo, если вы хотите, чтобы чистый код использовал Шаблон проектирования строитель, теперь вы можете легко реализовать этот дизайн через библиотеку Ломбок, поэтому вы можете просто аннотировать свою сущность следующим образом:
@Entity
@Getter @Setter @NoArgsConstructor @AllArgsConstructor
@Builder(toBuilder = true)
class RandomEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
Итак, действительно есть несколько интересных аннотаций, например @Getter
и @Setter
, чтобы избежать всех этих геттеров и сеттеров, @Builder(toBuilder = true)
для работы с дизайном компоновщика, чтобы ваш контроллер мог выглядеть так:
@GetMapping("/create")
public RandomEntity create() {
// Create your Object via Builder design
RandomEntity rdEntity = RandomEntity.builder()
.name("Bla Bla")
.build();
// Note also here save should take your Object and return RandomEntity not a String
return randomRepository.save(rdEntity);
}
просто попробуйте @GeneratedValue (strategy = GenerationType.AUTO)