2016-12-16 1 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은이를 삽입해야합니다.

어떻게 해결할 수 있습니까?

@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; 
... 
} 
+1

당신은 당신이 실제로 /가 계속로드 코드를 추가 할 수 있습니다 : 당신의 아이 엔티티가 업데이트 얻을 것이다 방법을 다음에 다시 시도하십시오? – Adam

+0

done @ Adam,보세요 parting –

답변

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 

    } 

+0

이미 시도해 봤지만, 이것도 작동하지 않습니다. 이것은 객체를 업데이트 할 때만 자식을 삽입하지 않을 때입니다. –

0

이것은 나를 위해 노력하고 있습니다 : 당신이 Child 클래스 내부의 A 클래스에 대한 참조를 가지고 있지 않기 때문이다

관련 문제