2017-12-26 8 views
0

두 개체가 일대 다 관계로 바인딩되어 있습니다. 그러나 한 엔티티는 다른 엔티티없이 존재할 수 있습니다. 그래서 관계는 단방향입니다. 이것으로;일대 다 단방향으로 두 테이블 간의 관계를 삭제하는 방법

@Entity 
public class TransportationOrderProduct { 

    @OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL) 
    private List<WarehousePackage> selectedWarehousePackages; 
} 

@Entity 
public class WarehousePackage{ 
} 

그리고 최대 절전 모드에서이 테이블을 만들었습니다.

TransportationOrderProduct

  • ID

TransportationOrderProductSelectedWarehousePackages

  • transportationOrderProductId
  • selectedWarehousePackageId
,

WarehousePackage

  • ID

컬렉션 (selectedWarehousePackages를) 가져 오는 모든 작동합니다. 그러나 TransportationOrderProduct.selectedWarehousePackages 목록을 지우고 새로 추가 할 때, Hibernate는 DuplicateEntry 예외를 던집니다. 운송 주문 상품 패키지 테이블에서 해당 운송 주문 상품을 두 번 삽입 할 수 없습니다.

내가 전화 할 때 Hibernate가 TransportationOrderProductSelectedWarehousePackages 테이블의 관계를 삭제하지 않기 때문이라고 생각합니다;

TransportationOrderProduct.selectedWarehousePackages.clear() 

일부 항목을 추가하십시오.

TransportationOrderProduct.selectedWarehousePackages.add(newPackage) 
TransportationOrderProduct.selectedWarehousePackages.add(newPackage) 
. 
. 

누군가 도움이 될 수 있습니까?

+0

당신의 관계는 여러 가지가 많습니까? – Mazen

+0

하나의 운송 오더는 여러 개의 패키지를 가질 수 있지만 하나의 패키지에는 하나 이상의 운송 오더가있을 수 없습니다. 그러나 다른 한편으로는 운송 주문없이 패키지가 존재할 수 있습니다. 이 관계가 맞습니까? – paroxit

+0

삭제 후에 flush()를 호출하십시오. –

답변

0

그것의 내가 이해 관계가 한 많은입니다 소리

enter image description here

이 단방향 one to many 연관

을 사용하지 마십시오

단방향 하나를 피하기 도메인 모델의 다 대다 관계. 그렇지 않으면, Hibernate는 예기치 않은 테이블을 생성하고 예상 한 것보다 많은 SQL 문을 실행할 수 있으며, 이는 하이버 네이트가 3 개의 엔티티를 생성하는 이유와 1 - 2 - 많은 관계로 2 개의 엔티티가되어야하는 이유를 확실히 설명합니다.우리는 당신이 당신이 교통 질서를 저장할 수 있습니다 주석

@Entity 
public class TransportationOrderProduct { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id") 
    private long id; 

@OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL) 
    private Set<WarehousePackage> packages= new HashSet<>(); 

public Set<WarehousePackage> getPackages() { 
    return packages; 
} 

public void setPackages(Set<WarehousePackage> packages) { 
    this.packages = packages; 
} 

public void addPackages (WarehousePackage value) { 
this.packages.add(value); 
} 

public void clearPackages (WarehousePackage value) { 
    this.packages.clear(); 
} 
    ... 
} 

@Entity 
public class WarehousePackage{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id") 
    private long id; 
} 

를 사용

attribute to map our association 필요 그것이 우리의 목적을 제공합니다 괜찮아 방향 사용하는 경우

단방향의 정의는 우리의 경우에없는 문제 소리 당신이 필요로하는 협회와 함께

TransportationOrderProduct transportation = new TransportationOrderProduct (); 

Set<WarehousePackage> packages = new HashSet <>() ; 
WarehousePackage package1 = new WarehousePackage() ; 
WarehousePackage package2 = new WarehousePackage() ; 
packages.add(package1); 
packages.add(package2); 
transportation.setPackages(packages) ; 

session.save(transportation);