Hibernate级联多对多在子参考中创建重复项
问题描述:
好吧,所以我是新的休眠。 问题是关于级联多对多,避免添加重复值。 所以我遵循这个例子。 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>
答
好的,我找到了解决方案。 首先,我使用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));
}
}
...
而且工作得很好。
需要更多的细节,添加实体的细节和代码如何保存实体。 – Chaitanya 2014-09-23 11:36:38
如果您使用的方法类似于示例中的方法,那么如果再次运行它,则它正确地再次添加一些东西。没有检查重复项。我想你可以添加一个修改的listEmployees(带有搜索参数)并检查该员工是否已经存在。 – Feroc 2014-09-23 11:38:38
这里有更多的问题比你想象的要多;该示例使用了一个Set,它在到达数据库之前应该已经防止了重复性...如果实体上的equals和hashcode方法被正确实现。 – Gimby 2014-09-23 11:42:27