我有一个父类“任务”,并且其中有一个子“标签”。我希望标签名称(请参见标签类)是唯一的,但是当我尝试保存父类时,正在创建新的子记录。我如何消除重复的子记录。
这是我的代码
任务类别
@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] 删除。
我来说两句