[英]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.