2017-01-10 34 views
0

我目前正在使用具有多对多关系的表格,并试图使用Hibernate来实现所有这些关系。将独特数据保存在循环中,以便在休眠状态下进行多对多关系

例如,三个表我已经有:

产品(ID,PNAME),用户(ID,PID,GID,UNAME),组(ID,的gname)

组处于一个一对多与用户关系

产品也与用户的一个一对多关系

用户与两个产品和组多到一的关系。

数据我会收到的样品低于:

Line 0: pname uname gname 
Line 1: Razer Billy admin 
Line 2: Razer Sally admin 
Line 3: Razer Benji admin 
Line 4: Yahoo Molly admin 
... 

从上面的例子,我希望我的产品表与Razer的三个项目上相关的只有两个条目(雷蛇和雅虎)结束了Users表和Yahoo与Users表中的一个条目关联。

我还希望我的组表最后只有一个与“用户”表上的四个条目关联的条目(“admin”)。

到目前为止,每当我收到一个新的数据线,我该如何确保没有重复的条目为产品创建组表,而是引用到现有在那里?

例如,如果第5行的数据是:Razer Jacky管理员,我如何确保Users表添加新条目“Jacky”,而此条目与条目“Razer”和“admin”相关联已经创建而不是在Product和Group表中创建重复条目?对于数据

我正确的有缺陷的循环是这样的:

// Three lists of same size created, 
// each list is a column of the sample data from above 
// ... 

Set<Users> users = new HashSet<Users>(); 
for(int i = 0; i < plist.size; i++){ 
    Product ptemp = new Product(plist.get(i)); 
    Group gtemp = new Group(glist.get(i)); 
    Users utemp = new Users(ptemp, gtemp, ulist.get(i)); 

    users.add(utemp); 

    ptemp.setUsers(users); 
    gtemp.setUsers(users); 

    session.save(ptemp); 
    session.save(gtemp); 
} 

谢谢!

回答

1

让我们来看你提供的例子。你想插入新行 - 的Razer张学友管理

其过程分为两个步骤 首先检查,如果产品的Razer和组管理出现在你的数据库。如果是,则加载它们,如果没有为它们创建新的对象。

下一步很简单,您只需要通过添加您在第一步中加载或创建的引用来持久保存用户数据。

希望这会有所帮助。

+0

感谢您的回答。只是为了澄清,坚持下去,你的意思是添加休眠注释(级联坚持)产品和组?通过相同的逻辑,我可以使用hibernate注释来检查数据库中的存在吗? – 000000000000000000000

+1

由于您不确定天气产品或组是否已经存在于您的数据库中。您必须通过查找它们来明确加载它们。它不能用'cascade'完成。如果在这种情况下使用Cascade,最终会在'product'和'group'中出现重复条目 – Ubercool

相关问题