2016-12-16 54 views
0

家长:弹簧引导起动数据JPA @OneToMany不会插入新的子当它是一个更新

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应该插入它们。

任何想法如何解决这个问题?

+1

您可以添加代码,你实际加载/坚持:请按照以下方式你的孩子的实体将得到更新再试一次吗? – Adam

+0

done @Adam,看看持久部分 –

回答

0

那是因为你没有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; 
... 
} 
+0

我已经试过了,也没有工作,这只是当我更新对象时,并没有插入孩子。 –

0

这一个是为我工作。

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 

    }