Java spring boot starter数据jpa@OneToMany在更新时不会插入新的子项
家长: 存储库:Java spring boot starter数据jpa@OneToMany在更新时不会插入新的子项,java,spring,jpa,spring-boot,spring-data-jpa,Java,Spring,Jpa,Spring Boot,Spring Data Jpa,家长: 存储库: @Entity public class Child { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) public Long child_id; } 持久化:更新 import org.springframework.data.repository.CrudRepository; @Transactional public interface ARepository extends CrudRepositor
@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();
}
当我插入一个新对象时,一切正常,所有子对象都能很好地插入到数据库中
但是,当我从数据库加载一个对象时,将一些子对象添加到列表中,然后更新该对象,这不会插入新的子对象
根据CascadeType的文档,所有文件都应插入它们
知道如何解决这个问题吗?这是因为在子类中没有对a类的引用:
这是因为在子类中没有对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;
...
}
这个对我有用。请按以下方式重试您的子实体将得到更新:
@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;
...
}
你能在实际加载/持久化的地方添加代码吗?done@Adam,看一看持久化部分你能在实际加载/持久化的地方添加代码吗?done@Adam,看一看持久化部分我已经试过了,也没用,这只是在我更新对象时,没有插入子对象。我已经试过了,也没用,这只是在我更新对象时,不会插入子对象。
@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
}