2014-09-23 5 views
1

좋아요. 그래서 나는 최대 절전 모드로 전환되었습니다. 질문은 중복 된 값을 추가하는 것을 피하면서 다단계 다단계에 관한 것입니다. 그래서 나는이 예를 따른다. tutorialspoint hibernate many to many mappingHibernate Cascade many to many는 자식 참조에 중복을 생성합니다.

문제는 그 프로그램을 실행하면 두 번이 인증서 테이블에 중복 값을 추가하는이입니다.

값을 employee 테이블에 삽입 한 후. 인증서 테이블에 폭포와 삽입 값 :이 예는 동일한 작업을 수행합니다 두 번째를 실행 한 후

id certificate_name 
1 PMP 
2 MBA 
3 MCA 

.

id certificate_name 
1 PMP 
2 MBA 
3 MCA 
4 PMP 
5 MBA 
6 MCA 

그러나 인증서 테이블에는 dublicate 값이 있습니다. 값 4 ~ 6은 1-3과 같습니다.

나는 테이블 인증서의 고유 제한 조건을 추가했지만, 나는이 오류 얻을 :

ERROR: Duplicate entry 'PMP' for key 'certificate_name_UNIQUE'

어떻게 내가 그들을 복제 할 수 없습니다 값을 삽입 할 수 있습니다. 이를 피할 수 있습니까? 아니면이를 수행하는 데 다른 기술을 사용해야합니까?

jar를 사용하려면 필요에 따라 pom.xml을 추가하십시오.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>testHibernateCascade2</groupId> 
    <artifactId>testHibernateCascade2</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <build> 
    <sourceDirectory>src</sourceDirectory> 
    <plugins> 
     <plugin> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <version>3.1</version> 
     <configuration> 
      <source>1.6</source> 
      <target>1.6</target> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 

    <dependencies> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>4.3.6.Final</version> 
    </dependency> 

    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.31</version> 
    </dependency> 
    </dependencies> 

</project> 
+0

자세한 내용을 보려면 엔티티 세부 정보와 엔티티 저장 방법 코드를 추가하십시오. – Chaitanya

+0

예제의 메서드와 비슷한 메서드를 사용하는 경우 다시 실행하면 다시 추가하는 것이 맞습니다. 중복에 대한 검사가 없습니다. 당신이 수정 된 listEmployees (검색 매개 변수 포함)를 추가하고 직원이 이미 존재하는지 확인할 수 있다고 생각합니다. – Feroc

+0

생각보다 많은 문제가 있습니다. 이 예제는 엔터티의 equals 및 hashcode 메서드가 제대로 구현 된 경우 이미 데이터베이스에 도달하기 전에 중복성을 방지해야하는 Set를 사용합니다. – Gimby

답변

0

좋아, 해결책을 찾았습니다. 먼저 HQL 및 Criteria를 사용하여 DB에 해당 인증서가 이미 존재하는지 확인합니다.

public int getID(String certificateName){ 

    Criteria cr = session.createCriteria(Certificate.class); 
    cr.add(Restrictions.eq("certificate", certificateName)); 
    List<?> results = cr.list(); 
    if (results.isEmpty()){ 
     return -1;} 
     else{ 
      Iterator<?> iterator = results.iterator(); 
      Certificate certificate = (Certificate) iterator.next(); 
      return certificate.getId(); 
     } 
} 

두 번째 경우 CERTIFICATE_NAME 내가 다른 내가 기존 추가 할 새로운 객체를 생성 인증서 테이블에 있지 않습니다.

... 
    String [] userCertificates = {"BKA","RRA","DMA"}; 

    HashSet<Certificate> certificatesSet = new HashSet<Certificate>(); 

    for (int i = 0; i<userCertificates.length;i++){ 
     int id = getID(userCertificates[i]); 
     if (id == -1){ 
      certificatesSet.add(new Certificate(userCertificates[i])); 
     } 
     else{ 
      certificatesSet.add((Certificate) cs.getObject(Certificate.class, id)); 
     } 
    } 
    ... 

그리고 매우 잘 작동했습니다.