Java双括号初始化导致IllegalArgumentException:未知实体

时间:2018-10-25 07:57:56

标签: java spring-boot spring-data-jpa

我只是尝试使用Spring Boot创建一个CRUD Web应用程序,但发现在框架中使用Java Double Brace初始化存在问题。

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 Double Brace Initialization更改为Normal Initialization时,应用程序可以正常运行。

你知道为什么吗? 非常感谢!

2 个答案:

答案 0 :(得分:2)

它看起来像是一个漂亮的捷径,它只调用您的类的构造函数,然后在创建的实例上调用一些初始化方法,但是所谓的double-brace initialization真正的作用是创建一个子类。休眠将不再知道如何处理。

因此,请避免使用它。只是为了节省您的一些按键操作而产生的大量开销和陷阱。

答案 1 :(得分:2)

我只想回答@Thilo,如果您想使用 Builder设计模式编写干净的代码,现在您可以通过Lombok库轻松实现此设计,这样您就可以像这样注释您的实体:

@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)可以与构建器一起使用,因此您的控制器看起来像: / p>

@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);
}