在我的Spring Boot应用程序中,我使用的是Spring-Data MongoDB,我有一个代表用户的简单POJO:
@EqualsAndHashCode
public class User implements Storable {
@Id
public ObjectId id;
@Getter @Setter public String firstName;
@Getter @Setter public String lastName;
@Getter @Setter public long userNum;
@DBRef(lazy = true)
@Getter @Setter public List<Section> sections = new ArrayList<Section>();
...
rest of class omitted
...
}
我的UserController看起来像这样:
@Controller
public class UserController {
@Autowired
UserRepository repository;
@ModelAttribute("allSections")
public List<Section> getSections() {
return sectionRepository.findAll();
}
@RequestMapping(value = "/users/new", method = RequestMethod.POST)
public String newUser(@ModelAttribute("user") User user) {
User newUser = new User();
newUser.userNum = user.userNum;
newUser.firstName = user.firstName;
newUser.lastName = user.lastName;
newUser.sections = user.sections;
newUser = repository.save(newUser);
for (Section section : newUser.sections) {
section.addToUsers(newUser);
sectionRepository.save(section);
}
return "redirect:/users";
}
... rest of controller omitted
}
请注意,我想要自动生成的字段不是ID字段。
我希望userNum
属性自动递增,以便创建和存储在数据库中的第一个用户对象以某个值开始...比如说9000,之后创建的每个用户加1 。
我有什么选择呢?我看过使用JPA的@GeneratedValue的例子,其他依赖自定义Mongo查询来创建序列集合的例子,但是我还没有能够工作......
答案 0 :(得分:1)
创建Counter集合:
import Text.Printf(printf)
concatMap (printf "%-4d") [1..n] ++ "\n"
然后是MongoRepository:
public class Counter {
@Id
private String id;
private long seq;
public Counter(String id, long seq) {
this.id = id;
this.seq = seq;
}
// Getters and setters
}
服务/ DAO:
@Repository
public interface CounterRepository extends MongoRepository<Counter, String> {}
答案 1 :(得分:1)
好的,我在这里想到了这就是我实现这个的方法:
userNum的类,这是一个简单的POJO
public class UserNum {
@Id
private ObjectId id;
@Getter
@Setter
public long seq;
public UserNum(long seq) {
this.seq = seq;
}
}
UserNumRepository定义了一个方法,该方法返回保存到集合的最后一个UserNum
@Repository
public interface UserNumRepository extends MongoRepository<UserNum, String> {
UserNum findTopByOrderByIdDesc();
}
UserNumService,它只是查找序列中的最后一个数字并创建下一个数字,然后保存并返回该数字。 UserNumService是具有一个方法签名的接口。这将创建一个已创建和使用的所有userNum的集合。
@Service
public class UserNumServiceImpl implements UserNumService {
@Autowired
private UserNumRepository userNumRepository;
@Override
public long getNext() {
UserNum last = userNumRepository.findTopByOrderByIdDesc();
long lastNum = last.seq;
UserNum next = new UserNum(lastNum + 1);
userNumRepository.save(next);
return next.seq;
}
}
在Application.java中,您可以使用起始编号或mongo shell为集合添加种子。
@Autowired UserNumRepository userNumRepository;
public void run(String... args) throws Exception {
userNumRepository.deleteAll();
// start the sequence at 9000
userNumRepository.save(new UserNum(9000));
}
最后,现在您可以在需要发布新的userNum时使用该服务,可能在构造函数中。