【问题标题】:spring-boot-starter-data-jpa @OneToMany does not insert new child when it's an updatespring-boot-starter-data-jpa @OneToMany 在更新时不会插入新的孩子
【发布时间】:2016-12-16 16:11:39
【问题描述】:

家长:

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

}

当我插入一个新的 A 对象时,一切正常,所有子对象都很好地插入数据库。

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

根据 CascadeType 的文档,ALL 应该插入它们。

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

【问题讨论】:

  • 你能在你实际加载/持久化的地方添加代码吗?
  • 完成@Adam,看看 Persisting 部分

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


【解决方案1】:

那是因为您在 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;
...
}

【讨论】:

  • 我已经试过了,也没用,只是我更新对象的时候,不插入子对象。
【解决方案2】:

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

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 2021-03-15
    • 2018-08-06
    • 2021-01-18
    • 2021-02-09
    相关资源
    最近更新 更多