首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate级联多到多在子引用中创建重复项。

Hibernate级联多到多在子引用中创建重复项。
EN

Stack Overflow用户
提问于 2014-09-23 11:33:31
回答 1查看 746关注 0票数 2

好吧,我刚开始冬眠。问题是多对多,避免添加重复的值。所以我遵循这个例子。教程hibernate很多到许多映射

问题是,如果我运行两次程序,它会向证书表添加重复的值。

在向employee表插入值后。它级联并将值插入到证书表:

代码语言:javascript
复制
id certificate_name
1   PMP
2   MBA
3   MCA

在我第二次运行这个示例之后,它会执行相同的操作。

代码语言:javascript
复制
id certificate_name
1   PMP
2   MBA
3   MCA
4   PMP
5   MBA
6   MCA

但是,证书表具有双重值。值4-6与1-3相同.

我试图在表证书上添加唯一约束,但随后得到了以下错误:

错误:重复输入'PMP‘键'certificate_name_UNIQUE’

如何插入值以避免重复它们。这是可以避免的,还是我必须使用其他技术来做到这一点。

如果需要使用jars,还可以添加pom.xml。

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

发布于 2014-09-24 06:11:38

好吧,我找到解决办法了。首先,我使用HQL和标准检查这种证书是否已经存在于DB中。

代码语言:javascript
复制
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不在证书表中,则创建新对象,否则添加现有对象。

代码语言:javascript
复制
    ...
    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));
        }
    }
    ...

而且效果很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25994043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档