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
}