Ich mache meine erste Web-Anwendung mit Spring Boot, Thymeleaf, Hibernate (mit In-Memory-H2-Datenbank). Ich möchte auch Spring Security verwenden, aber ich versuche, es für jetzt zu vermeiden (will Entities und Repositories zuerst beenden, obwohl ich weiß, dass ich die Art ändern muss, wie sie arbeiten) Ich möchte einen Benutzer auf meiner Website registrieren (er ist erstellt und zu meiner db hinzugefügt) und dann kann er seine ToDos (die auch in db gespeichert sind) CRUD. Ich habe beide Entitäten mit bidirektionaler OneToMany mit Annotationen und @ JoinTable/@ mappedBy verbunden. Hier sind meine Einheiten:So speichern Sie ein Objekt in db und verbinden Sie es mit dem angemeldeten Benutzer
ToDoItem.java
@Entity
@Table (name = "TO_DO_ITEM")
public class ToDoItem extends BaseEntity {
@Column(name = "TITLE", nullable = false)
private String title;
@Column(name = "COMPLETED")
private boolean completed;
// TODO: 29.01.17 Add description property
@Column(name = "DUE_DATE", nullable = false)
private LocalDate dueDate;
// two-directional OneToMany
@ManyToOne
@JoinColumn(name = "USER_ID")
private User user;
// JPA demands empty contructor
ToDoItem() {}
public ToDoItem(String title, LocalDate dueDate) {
this.title = title;
this.dueDate = dueDate;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public boolean isCompleted() {
return completed;
}
public void setCompleted(boolean completed) {
this.completed = completed;
}
public LocalDate getDueDate() {
return dueDate;
}
public void setDueDate(LocalDate dueDate) {
this.dueDate = dueDate;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
User.java
@Entity
@Table (name = "USERS")
public class User extends BaseEntity {
@Column(name = "USERNAME")
private String username;
// TODO: 28.01.17 Find a way to store hashed and salted pws in DB
@Column(name = "PASSWORD")
private String password;
@Column(name = "EMAIL")
private String email;
@OneToMany(mappedBy = "user")
private Set<ToDoItem> toDoItems = new HashSet<>();
// JPA demands empty constructor
User() {}
public User(String username, String password, String email) {
this.username = username;
this.password = password;
this.email = email;
}
public Set<ToDoItem> getToDoItems() {
return toDoItems;
}
public void setToDoItems(Set<ToDoItem> toDoItems) {
this.toDoItems = toDoItems;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
ich einen Satz in User.java initialisiert bin, so kann ich erstellte Elemente hinzufügen, indem Sie angemeldet in user zu seinem eigenen Satz, so dass sie nicht nur an die db gesendet werden, aber sie sind tatsächlich verbunden. Jetzt brauche ich nur noch eine Methode, um neu erstellte Items zu seinem Set (und zur db) hinzuzufügen.
Ich habe zwei Service-Bohnen: ToDoItemServiceBean.java
@Service
public class ToDoItemServiceBean implements ToDoItemService {
@Autowired
private ToDoItemRepository toDoItemRepository;
@Override
public Iterable<ToDoItem> listAllToDoItems() {
return toDoItemRepository.findAll();
}
@Override
public ToDoItem getToDoItemById(Long id) {
return toDoItemRepository.findOne(id);
}
@Override
public ToDoItem addNewToDo(ToDoItem toDoItem) {
return toDoItemRepository.save(toDoItem);
}
@Override
public void deleteToDo(Long id) {
toDoItemRepository.delete(id);
}
}
UserServiceBean.java
@Service
public class UserServiceBean implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public User saveUser(User user) {
return userRepository.save(user);
}
}
Und ich habe keine Ahnung, wie man diese ToDos auf einen bestimmten Benutzer hinzuzufügen, in db. Sollte ich einfach ein Element zu einem Set in addNewToDo hinzufügen, so würde diese Methode neben dem Hinzufügen neuer ToDo zu db auch irgendwie ToDo mit einem Benutzer verbinden? Aber wie mache ich das? Was ist der beste Ansatz, um es zu beheben?
HERE ist der Rest meines Codes (wollte nicht alle meine Dateien in diesen Beitrag einfügen).
EDIT: ich meine db Struktur neu überdacht, und ich denke, dass ich OneToMany in UserEntity haben sollte, weil Benutzer viele ToDos aber OneToOne in ToDoItemEntity haben kann, weil ein ToDo nur ein Benutzer haben kann - das ist richtig, nicht wahr?
Und von diesem Link habe ich so etwas gemacht, ist es in Ordnung?
ToDoItemEntity
// a ToDoItem is only associated with one user
@OneToOne(cascade = CascadeType.ALL, mappedBy = "toDoItems")
private User user;
UserEntity
//user can have many ToDoItems
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "USER_ID")
private Set<ToDoItem> toDoItems;
Added Updateuser an: UserServiceBean.java
@Override
public void updateUser(ToDoItem toDoItem) {
User currentUser = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
User queriedUser = userRepository.findOne(currentUser.getId());
queriedUser.setToDoItems();
}
Ein Benutzer viele todo Artikel und viele todoitems gehört zu einem Benutzer kann so ein bis viele und viele eins ist. Sie entscheiden, ob es bidirektional oder unidirektional ist. also ändere Onetoone zu ManyToOne – Barath