休眠更新子集合

里拉杜尔加·普拉萨德·冈蒂

我有一个父类“任务”,并且其中有一个子“标签”。我希望标签名称(请参见标签类)是唯一的,但是当我尝试保存父类时,正在创建新的子记录。我如何消除重复的子记录。

这是我的代码

任务类别

    @Entity
    @Table(name="tasks")
    public class TaskDTO {

    ...
    ...

    @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @JoinTable( name = "task_tags",joinColumns = { @JoinColumn(name = "taskId") }, inverseJoinColumns = { @JoinColumn(name = "tagId") })
        private List<TagDTO> tags = new ArrayList<TagDTO>(); 


}

标签类别

@Entity
@Table(name="tags")
public class TagDTO {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "tagId")
    private int tagId;

    @Column(name = "tagName")
    private String tagName;
}

TaskDAOImpl

@Repository("taskDAOImpl")
public class TaskDAOImpl implements TaskDAO {

@Override
    public Integer saveTask(TaskDTO taskDTO) {
        Integer identifier = null;
        try {


            Session session = sessionFactory.getCurrentSession();
            session.beginTransaction();

            ..........
            ..........
            identifier = (Integer) session.save(taskDTO);

            return identifier;
        } catch (Exception ex) {
            logger.error("unable to save task ", ex);
        }
        return null;
    }

当我保存标签时,我将其保存到数据库中。

mysql> select * from tags;
+-------+---------+
| tagId | tagName |
+-------+---------+
|     1 | java    |
|     2 | java    |
+-------+---------+
2 rows in set (0.00 sec)

mysql> select * from task_tags;
+--------+-------+
| taskId | tagId |
+--------+-------+
|     69 |     1 |
|     70 |     2 |
+--------+-------+
2 rows in set (0.00 sec)

我想消除保存两次的tagName。

但是我想要这样的事情

mysql> select * from tags;
    +-------+---------+
    | tagId | tagName |
    +-------+---------+
    |     1 | java    |
    +-------+---------+
    2 rows in set (0.00 sec)

    mysql> select * from task_tags;
    +--------+-------+
    | taskId | tagId |
    +--------+-------+
    |     69 |     1 |
    |     70 |     1 |
    +--------+-------+
    2 rows in set (0.00 sec)

请帮我。提前谢谢大家。

里拉杜尔加·普拉萨德·冈蒂

终于我像这样解决了这个谜

public Integer saveTask(TaskDTO taskDTO) {
        Integer identifier = null;
        try {
            ....
            ....
            Session session = sessionFactory.getCurrentSession();
            for(int i=0 ; i < taskDTO.getTags().size(); i++) {
                TagDTO tagDTO = taskDTO.getTags().get(i);
                TagDTO data = (TagDTO) session.createCriteria(TagDTO.class).add(Restrictions.eq("tagName", tagDTO.getTagName())).uniqueResult();
                if(null == data) {
                    taskDTO.getTags().set(i,tagDTO);
                } else {
                    taskDTO.getTags().set(i,data);
                }

            }
            session.beginTransaction(); // <-- this is key point, started transaction from here.
            for(int i = 0 ; i < taskDTO.getUsers().size() ; i++) {
                UserDTO userDTO = taskDTO.getUsers().get(i);
                userDTO = (UserDTO) session.get(UserDTO.class,userDTO.getUserId());
                userDTO.getTasks().add(taskDTO);
                taskDTO.getUsers().set(i,userDTO);
            }
            ....
            ....
            identifier = (Integer) session.save(taskDTO);
            return identifier;
        } catch (Exception ex) {
            logger.error("unable to save task ", ex);
        }
        return null;
    }

我从数据库获取标签后开始了事务,然后在数据库中看到了

mysql> select * from tags;
+-------+---------+
| tagId | tagName |
+-------+---------+
|    11 | java    |
+-------+---------+
1 row in set (0.00 sec)

mysql> select * from task_tags;
+--------+-------+
| taskId | tagId |
+--------+-------+
|     11 |    11 |
|     12 |    11 |
+--------+-------+
2 rows in set (0.00 sec)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Servicestack ORMLite更新子集合

来自分类Dev

更新CloudFunctions上的子集合

来自分类Dev

Servicestack ORMLite更新子集合

来自分类Dev

MongoDB C#批量更新/替换子集合

来自分类Dev

MongoDB并发更新(带有子集合)

来自分类Dev

在mongo中更新或追加到子集合

来自分类Dev

Spring Data JPA/REST 更新子集合

来自分类Dev

更新 EF6 中的实体子集合

来自分类Dev

Firestore子集合ID

来自分类Dev

子集合中的总和

来自分类Dev

Firestore 子集合 '!=' 查询

来自分类Dev

DevExpress XAF:获取子集合的集合

来自分类Dev

Firestore云功能以递归方式更新子集合/集合组

来自分类Dev

在TEntity通用存储库上更新父集合和子集合

来自分类Dev

Blazor /实体框架-将子集合添加到时更新父

来自分类Dev

Firestore:更新父级后如何将文档添加到子集合

来自分类Dev

Node.js /猫鼬-添加,更新和删除子集合中的项目

来自分类Dev

pymongo子集合中的upsert增量

来自分类Dev

AutoMapper忽略子集合属性

来自分类Dev

Mongodb:如何获取子集合列表

来自分类Dev

经典ASP JSON子集合

来自分类Dev

使用QueryOver过滤子集合

来自分类Dev

在子集合Firestore中查询文档

来自分类Dev

Firestore查询文档的子集合

来自分类Dev

Firestore / Flutter:查询文档的子集合

来自分类Dev

Firestore从子集合返回对象

来自分类Dev

带子集合的Firebase查询

来自分类Dev

Firestore从哪里查询获取子集合

来自分类Dev

Hibernate OGM映射到子集合