Инициализация двойной скобки Java вызывает исключение IllegalArgumentException: неизвестный объект

Я просто пытаюсь создать веб-приложение 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 на нормальную инициализацию, приложение запускается правильно.

Вы знаете почему? Большое спасибо!

просто попробуйте @GeneratedValue (strategy = GenerationType.AUTO)

this_is_om_vm 25.10.2018 10:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
107
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это может выглядеть как изящный ярлык, который просто вызывает конструктор вашего класса, за которым следуют некоторые методы инициализации для созданного экземпляра, но на самом деле так называемый инициализация двойных скобок действительно делает создать подкласс вашего класса Entity. Hibernate больше не будет знать, как с этим бороться.

Так что постарайтесь этого избежать. У него много накладных расходов и ошибок, чтобы сэкономить вам несколько нажатий клавиш.

Большое спасибо! Теперь у меня достаточно поводов, чтобы поблагодарить. У меня вопрос, откуда вы это знаете?

TranNgocKhoa 27.10.2018 16:28

Я просто хочу завершить ответ @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);
}

Другие вопросы по теме