Hibernate的级联多对多创建在子引用重复(Hibernate cascade many to

2019-10-21 00:38发布

好了,所以我是新来的冬眠。 现在的问题是关于级联多对许多人来说,避免增加重复的值。 所以我遵循这个例子。 tutorialspoint冬眠多对多映射

问题是这样的,如果我运行程序两次将其添加重复值证书表。

之后我插入值职员表。 这瀑布和插入值证书表:

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。

我尝试添加表证书唯一约束,但后来我得到这个错误:

错误:重复项“PMP”关键“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>

Answer 1:

好吧,我找到了解决办法。 首先,我检查,如果该证书已在DB使用HQL和标准存在。

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

这工作非常出色。



文章来源: Hibernate cascade many to many creates duplicates in child reference