MongoDB对事务的支持是在4.0以及以上的版本。并且如果想要对事务支持,必须要配置MongoDB副本集。因为Mongo的事务是建立在副本集上的。
这里配置副本集:https://blog.csdn.net/qq_19674263/article/details/105799181
Maven配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
application.properties
spring.data.mongodb.uri=mongodb://root:root@localhost:27000/qcx_test?replicaSet=rs
必须要设置 replicaSet指定节点名称,在配置文件中配置的。
想要对事务支持,要这是MongoDB事务配置
@Configuration
public class MongoDBConfig {
@Bean
MongoTransactionManager transactionManager(MongoDbFactory factory){
return new MongoTransactionManager(factory);
}
}
然后就是基本的业务代码了
两个实体类User和Role
public class User implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键自增
*/
private Long id;
/**
* 用户名
*/
private String userName;
/**
* 年龄
*/
private Integer age;
/**
* 密码
*/
private String passWord;
/**
* 当前用户的上级主键
*/
private Long leaderId;
/**
* 人员类型0/1:普通员工/管理员
*/
private Integer type;
/**
* 是否在线0/1:否/是
*/
private Boolean online;
/**
* 删除标志(0/1:在用/停用)
*/
private Integer dr;
/**
* 最后登录时间
*/
private LocalDateTime lastLoginTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public Long getLeaderId() {
return leaderId;
}
public void setLeaderId(Long leaderId) {
this.leaderId = leaderId;
}
public Integer getType() {
return type;
}
public void setType(Integer type) {
this.type = type;
}
public Boolean getOnline() {
return online;
}
public void setOnline(Boolean online) {
this.online = online;
}
public Integer getDr() {
return dr;
}
public void setDr(Integer dr) {
this.dr = dr;
}
public LocalDateTime getLastLoginTime() {
return lastLoginTime;
}
public void setLastLoginTime(LocalDateTime lastLoginTime) {
this.lastLoginTime = lastLoginTime;
}
}
public class Role implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 权限名
*/
private String roleName;
/**
* 备注
*/
private String remark;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
}
两个数据访问层UserDao和RoleDao
@Repository
public class UserDao {
@Autowired
private MongoTemplate mongoTemplate;
public void insert(User user){
mongoTemplate.insert(user);
}
public void update(User user){
Query query = Query.query(Criteria.where("id").is(user.getId()));
Update update = new Update().set("age",user.getAge());
mongoTemplate.updateFirst(query,update,User.class);
}
public void deleteById(Long id) {
Query query=new Query(Criteria.where("id").is(id));
mongoTemplate.remove(query,User.class);
}
public User find(Long id){
Query query = new Query(Criteria.where("id").is(id));
return mongoTemplate.findOne(query,User.class);
}
}
@Repository
public class RoleDao {
@Autowired
private MongoTemplate mongoTemplate;
public void insert(Role role){
mongoTemplate.insert(role);
}
}
一个业务逻辑测试类
@Service
public class MongoDBServiceImpl implements MongoDBService {
@Autowired
private UserDao userDao;
@Autowired
private RoleDao roleDao;
@Transactional(rollbackFor = {Exception.class})
public Boolean testTran() {
User user1 = userDao.find(1l);
user1.setAge(36);
userDao.update(user1);
Role role = new Role();
role.setId(3l);
role.setRoleName("hahaha");
role.setRemark("dasdsadad");
roleDao.insert(role);
User user = new User();
user.setId(2l);
user.setAge(22);
user.setUserName("qwerty");
user.setOnline(false);
userDao.insert(user);
return null;
}
}
注意:
mongo在支持事务的同时,就不支持自动创建表了,所以如果我们想自动创建表就不能把初始化表的代码放在事务里。最好是提前手动执行好建表语句。
db.createCollections();