我只是尝试使用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时,应用程序可以正常运行。
你知道为什么吗? 非常感谢!
答案 0 :(得分:2)
它看起来像是一个漂亮的捷径,它只调用您的类的构造函数,然后在创建的实例上调用一些初始化方法,但是所谓的double-brace initialization真正的作用是创建一个子类您的Entity类的em>。休眠将不再知道如何处理。
因此,请避免使用它。只是为了节省您的一些按键操作而产生的大量开销和陷阱。
答案 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);
}