2017-01-30 2 views
2

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(); 
} 
+0

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

Antwort

0

können Sie ToDoItems zum Benutzer hinzufügen und die Benutzereinheit speichern.Nutzen Sie Cascade Operationen die Operation kaskadieren

http://howtodoinjava.com/hibernate/hibernate-jpa-cascade-types/

// two-directional OneToMany 
@ManyToOne(cascade=CascadeType.ALL) 
@JoinColumn(name = "USER_ID") 
private User user; 

Update: UserServiceBean.java

public void updateUser(User user){ 
    // update the user entity here by adding the todoitems and call saveuser again 
} 

Update 2: ToDoItemController

@Override 
    public ToDoItem addNewToDo(ToDoItem toDoItem) { 
     return toDoItemRepository.updateItems(toDoItem); 
    } 

ToDoItemServiceBean:

public void updateItems(ToDoItem toDoItem) { 
    User currentUser = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
    User queriedUser = userRepository.findOne(currentUser.getId()); 
    toDoItem.setUser(queriedUser); 
    saveToDoItem(toDoItem)// since it is bidirectional 

} 
+0

Ich habe meinen Beitrag oben bearbeitet - könntest du nachsehen, ob das Sinn macht? – doublemc

+0

Was ist mit dieser Set-Initialisierung? Brauche ich nicht eine Methode, ToDos zu diesem Set hinzuzufügen, so dass ein einzelner Benutzer wirklich mit seinen ToDos verbunden ist ?? Oder es ist überflüssig und wenn ein Benutzer sich anmeldet und ein paar ToDos hinzufügt, werden Kaskaden automatisch seine Todos mit ihm verbinden? – doublemc

+0

keine Initialisierung erforderlich Hier einstellen. Fügen Sie dem Benutzer todoitems hinzu und speichern Sie die Benutzereinheit oder umgekehrt. – Barath

Verwandte Themen