2017-10-23 20 views
1

에서 @EmbeddedId 내에서 내가 추가 데이터 교차 테이블을 추가 해요 내가 이 표에 기록에 의해 바인딩 된 개체에 대한 복잡한 ID를 만들기 위해을 @EmbeddedId 사용 (entity1entity2).캐스케이드 최대 절전

Entity1ToEntity2Link에서
@OneToMany(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}, 
      fetch = FetchType.LAZY, mappedBy = "id.entity1") 
private List<Entity1ToEntity2Link> links = new ArrayList<>(); 

내가 @EmbeddedId이 있고 그 안에 내가 링크가 있습니다

가 나는 그래서 엔티티 1. 저장할 때 캐스케이드를 통해 모든 데이터를 저장하려면, 그 실체 일에 내가 가지고있는 이유 두 개체. 그러나, 나는 엔티티 1. 그래서, 이런 식으로 만들어 저장할 때 두 번째 저장하려는 :

@ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) 
private Entity2 entity2; 

그러나, unfortunatelly, 내가 @EmbeddedId 내부에있는 폭포가 무시 될 것으로 보인다. 나는 삽입에 대한 그 SQL이 생성되지 않습니다 볼 수 있고 Entity1ToEntity2Link가 저장 될 때 나는 오류 얻을 :

violated - parent key not found

내가 @EmbeddedId이 폭포를 지원하지 않는 것으로 생각합니다. 그러나, 나는 확실하지 않다. Entity1ToEntity2Link가 저장되기 전에 entity2를 저장할 수있는 아이디어가 있습니까?


아이디 개체 : 대신 Entity1ToEntity2Link가 직접 ManyToMany 관계를하려고 사용

@Embeddable 
public class LinkId extends AbstractLinkId { 
    //... 
    @ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) 
    private Entity2 entity2; 
    //... 
} 


@MappedSuperclass 
public class AbstractLinkId { 
    //... 
    @ManyToOne 
    private Entity1 entity1; 
    //... 
} 

답변

1

.

public class Entity1 { 

    @ManyToMany 
    @JoinTable(
     name="LINK_TABLE_NAME", 
     [email protected](name="ENTITY1_ID", referencedColumnName="ID"), 
     [email protected](name="ENTITY2_ID", referencedColumnName="ID")) 
    private List<Entity2> entities2; 
} 

public class Entity2 { 

    @ManyToMany(mappedBy="entities2") 
    private List<Entity1> entities1; 
} 

귀하의 접근 방식에 따른 문제점은 다음과 같습니다. Entity1ToEntity2Link로 캐스케이드하는 Entity1에서 save를 호출하려고합니다. 이제 Entity1ToEntity2Link는 기본 키에 대해 Entity1이 필요하지만 Entity1은 아직 존재하지 않습니다.

Entity1ToEntity2Link를 사용하여 저장하려면 두 가지 방법이 있습니다.

첫 번째 : Entity1ToEntity2Link에 캐스케이드를 추가하지 말고 Entity1을 저장 한 후 링크를 ​​저장하십시오.

두 번째 : 생성 된 Id를 Entity1ToEntity2Link에 추가합니다.

+0

두 번째 해결책이 저에게 효과적입니다. 자동 생성 된 ID를 추가하고 이전 ID를 @ 삽입 된 객체로 만듭니다. 그러나 @ EmbeddedId가 캐스 캐 이드 저장을 지원하지 않는 이유는 무엇입니까? 문서화되어 있습니까? – dvelopp