弹簧启动启动器数据 JPA @OneToMany在更新时不会插入新子项



parent:

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Embedded;
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;
@OneToMany(cascade = {CascadeType.ALL}, orphanRemoval = true)
public List<Child> child = new LinkedList<>();
}

儿童:

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

持久:更新

public class SomeClass {
  @Autowired
  private ARepository repo;
  public void someMethod() {
    List<A> as = repo.findAs();
    A firstA = as.get(0);
    firstA.child.add(new Child());
    repo.save(firstA);
  }    
}

当我插入一个新的对象时,一切都可以正常工作,所有孩子都很好地插入数据库中。

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

根据cascadeType的文档,所有这些都应插入它们。

任何想法如何修复?

那是因为您没有对Child类中的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;
...
}

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

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
}

最新更新