2014-09-23 122 views
1

好吧,所以我是新的休眠。 問題是關於級聯多對多,避免添加重複值。 所以我遵循這個例子。 tutorialspoint hibernate many to many mappingHibernate級聯多對多在子參考中創建重複項

問題是這樣的,如果我運行程序兩次,它會將重複值添加到證書表。

將值插入到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'

我如何可以插入值,不要重複它們。 這可以避免,或者我必須使用其他技術來做到這一點。

如果需要使用罐子,還可以添加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 2014-09-23 11:36:38

+0

如果您使用的方法類似於示例中的方法,那麼如果再次運行它,則它正確地再次添加一些東西。沒有檢查重複項。我想你可以添加一個修改的listEmployees(帶有搜索參數)並檢查該員工是否已經存在。 – Feroc 2014-09-23 11:38:38

+0

這裏有更多的問題比你想象的要多;該示例使用了一個Set,它在到達數據庫之前應該已經防止了重複性...如果實體上的equals和hashcode方法被正確實現。 – Gimby 2014-09-23 11:42:27

回答

0

好的,我找到了解決方案。 首先,我使用HQL和Criteria檢查數據庫中是否存在這樣的證書。

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)); 
     } 
    } 
    ... 

而且工作得很好。