Java spring boot starter数据jpa@OneToMany在更新时不会插入新的子项

Java spring boot starter数据jpa@OneToMany在更新时不会插入新的子项,java,spring,jpa,spring-boot,spring-data-jpa,Java,Spring,Jpa,Spring Boot,Spring Data Jpa,家长: 存储库: @Entity public class Child { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) public Long child_id; } 持久化:更新 import org.springframework.data.repository.CrudRepository; @Transactional public interface ARepository extends CrudRepositor

家长:

存储库:

@Entity
public class Child {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Long child_id;

}
持久化:更新

import org.springframework.data.repository.CrudRepository;
@Transactional
public interface ARepository extends CrudRepository<A,Long> {

@Query("SELECT x FROM A x WHERE x.syncTimestamp IS NULL")
List<A> findAs();
}
当我插入一个新对象时,一切正常,所有子对象都能很好地插入到数据库中

但是,当我从数据库加载一个对象时,将一些子对象添加到列表中,然后更新该对象,这不会插入新的子对象

根据CascadeType的文档,所有文件都应插入它们


知道如何解决这个问题吗?

这是因为在子类中没有对a类的引用:


这是因为在子类中没有对a类的引用:


这个对我有用。请按以下方式重试您的子实体将得到更新:

@Entity
public class A {
...
     @OneToMany(mappedBy = "a", cascade = {CascadeType.ALL}, orphanRemoval = true)
     public List<Child> child = new LinkedList<>();
}

@Entity
public class Child {
...
    @ManyToOne
    @JoinColumn(name = "your_table_name")
    private A a;
...
}

这个对我有用。请按以下方式重试您的子实体将得到更新:

@Entity
public class A {
...
     @OneToMany(mappedBy = "a", cascade = {CascadeType.ALL}, orphanRemoval = true)
     public List<Child> child = new LinkedList<>();
}

@Entity
public class Child {
...
    @ManyToOne
    @JoinColumn(name = "your_table_name")
    private A a;
...
}

你能在实际加载/持久化的地方添加代码吗?done@Adam,看一看持久化部分你能在实际加载/持久化的地方添加代码吗?done@Adam,看一看持久化部分我已经试过了,也没用,这只是在我更新对象时,没有插入子对象。我已经试过了,也没用,这只是在我更新对象时,不会插入子对象。
@Entity
public class A {
...
     @OneToMany(mappedBy = "a", cascade = {CascadeType.ALL}, orphanRemoval = true)
     public List<Child> child = new LinkedList<>();
}

@Entity
public class Child {
...
    @ManyToOne
    @JoinColumn(name = "your_table_name")
    private A a;
...
}
public class SomeClass {

    @Autowired
    private ARepository repo;

    public void someMethod() {

        List<A> as = repo.findAs();
        A firstA = as.get(0);
        List<Child> childs=firstA.getChild();

        // add new child value
        childs.add(new Child("Test"));
        firstA.setChild(childs);

        for (Child child : childs) {
            child.setA(firstA);
        }
        repo.save(firstA);
    }    

}


import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;

@Entity
public class Child {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Long child_id;

    public Child(String name) {
        // TODO Auto-generated constructor stub
        this.name=name;
    }

    public Child() {
        // TODO Auto-generated constructor stub
    }
    private String name;

    @ManyToOne
    @JoinColumn(name="a_id")
    private A a;

    //your getter setter

}

import java.util.LinkedList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class A {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Long id;

    private String syncTimestamp=null;

    @OneToMany(mappedBy="a", cascade=CascadeType.ALL)
    public List<Child> child = new LinkedList<>();

    // your getter setter

}