簡體   English   中英

spring-boot-starter-data-jpa @OneToMany 在更新時不會插入新子項

[英]spring-boot-starter-data-jpa @OneToMany does not insert new child when it's an update

家長:

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 的文檔,所有人都應該插入它們。

知道如何解決這個問題嗎?

那是因為您沒有對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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM