代码之家  ›  专栏  ›  技术社区  ›  chawki challadia

在spring中保存用@eelementcollection标记的元素

  •  0
  • chawki challadia  · 技术社区  · 7 年前

    大家好,

    我有一个名为engine的类,其中指定了一个名为constraints的元素集合。当我发送json请求时,它要么无法将新实例完全保存在数据库(引擎实例)中,要么只是保存它而不保存约束。如果有人能澄清我的代码或解决这个问题的方法有什么问题,我将不胜感激。

    这是我的班级:

    引擎实体类:

    @Entity
    @Table(name = "quiz_engines")
    @EntityListeners(AuditingEntityListener.class)
    @JsonIgnoreProperties(
            value = {"lastModified"},
            allowGetters = true
    )
    public class Engine implements Model {
    @Id
    @Column(name = "engine_id", unique = true, nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, targetEntity = com.QCMGenerator.QCMGenerator.Model.Test.class)
    @JoinColumn(name = "test_id", referencedColumnName = "test_id", nullable = false, updatable = false)
    @OnDelete(action = OnDeleteAction.CASCADE)
    @JsonIgnore
    private Test test;
    
    @Column(name = "quiz_name", nullable = false)
    @NotNull
    private String name;
    
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "last_modified", nullable = false)
    @LastModifiedDate
    private Date lastModified;
    
    @ElementCollection
    @CollectionTable(name = "engine_constraints", joinColumns = @JoinColumn(name = "engine_id"))
    private List<EngineConstraint> constraints;
    
    public Engine() {
    }
    
    public Engine(@NotNull String name, List<EngineConstraint> constraints) {
        this.name = name;
        this.constraints = constraints;
    }
    
    public Long getId() {
        return id;
    }
    
    public void setId(Long id) {
        this.id = id;
    }
    
    public Test getTest() {
        return test;
    }
    
    public void setTest(Test test) {
        this.test = test;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public Date getLastModified() {
        return lastModified;
    }
    
    public void setLastModified(Date lastModified) {
        this.lastModified = lastModified;
    }
    
    public List<EngineConstraint> getConstraints() {
        return constraints;
    }
    
    public void setConstraints(List<EngineConstraint> constraints) {
        this.constraints = constraints;
    }
    

    }

    发动机DTO等级:

    public class EngineDTO implements ModelDTO {
    
    private Long id;
    
    @JsonIgnore
    private TestDTO test;
    
    private String name;
    
    private Date lastModified;
    
    private EngineConstraintList constraints;
    
    public Long getId() {
        return id;
    }
    
    public void setId(Long id) {
        this.id = id;
    }
    
    public TestDTO getTest() {
        return test;
    }
    
    public void setTest(TestDTO test) {
        this.test = test;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public Date getLastModified() {
        return lastModified;
    }
    
    public void setLastModified(Date lastModified) {
        this.lastModified = lastModified;
    }
    
    public EngineConstraintList getConstraints() {
        return constraints;
    }
    
    public void setConstraints(EngineConstraintList constraints) {
        this.constraints = constraints;
    }
    

    }

    EngineConstraintList类:

    @Embeddable
    public class EngineConstraintList implements Serializable {
    
    private List<EngineConstraint> engineConstraints;
    
    public EngineConstraintList() {}
    
    public List<EngineConstraint> getEngineConstraints() {
        return engineConstraints;
    }
    
    public void setEngineConstraints(List<EngineConstraint> engineConstraints) {
        this.engineConstraints = engineConstraints;
    }
    

    }

    发动机应变等级:

    @Embeddable
    public class EngineConstraint implements Serializable {
    
    @Column
    private Integer weight;
    
    @Column
    private Integer questionsCount;
    
    public EngineConstraint() {
    }
    
    public EngineConstraint(Integer weight, Integer questionsCount) {
        this.weight = weight;
        this.questionsCount = questionsCount;
    }
    
    public Integer getWeight() {
        return weight;
    }
    
    public void setWeight(Integer weight) {
        this.weight = weight;
    }
    
    public Integer getQuestionsCount() {
        return questionsCount;
    }
    
    public void setQuestionsCount(Integer questionsCount) {
        this.questionsCount = questionsCount;
    }
    

    }

    我的控制器的post方法

    public ResponseEntity<?> saveEngine(
            @PathVariable(value = "testID") Long testID,
            @Valid @RequestBody EngineDTO newEngine
    ){
        if(!testRepo.existsById(testID)){
            throw new ResourceNotFoundException("No test with the ID '"+testID+"' was found...");
        }
    
        Test test = testRepo.findById(testID).get();
        EngineDTO savedEngineDTO = null;
        try {
            Engine engine;
            if(newEngine.getName() != null && newEngine.getConstraints() != null){
                engine = new Engine(newEngine.getName(), newEngine.getConstraints().getEngineConstraints());
            }else{
                throw new ResourceNotFoundException("The engine name field and constraints field cannot be empty....");
            }
    
            engine.setTest(test);
            Engine savedEngine = engineRepo.save(engine);
            savedEngineDTO = convertToDTO(savedEngine);
        }catch (Exception e){
            System.out.println(e.getMessage());
        }
    
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }
    

    提前感谢大家的帮助和宝贵的时间。非常感谢。

    祝大家愉快…

    0 回复  |  直到 7 年前