2016-07-31 8 views
2

Ich entwickle kleine Spring MVC-Anwendung, und ich habe ein Problem mit dem Löschen von Kunden aus MySQL-Datenbank. Wenn ich einen Kunden wie einen Administrator lösche, verschwindet der Kunde nur in der Kundentabelle und verbleibt in den Tabellen für Berechtigungen und Benutzer. Die Frage ist, wie man es repariert?Spring Mvc - Benutzer aus der Datenbank löschen

User.class

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private int usersId; 
private String username; 
private String password; 
private Boolean enabled; 
private int customerId; 


public int getUsersId() { 
    return usersId; 
} 

public void setUsersId(int usersId) { 
    this.usersId = usersId; 
} 

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 Boolean getEnabled() { 
    return enabled; 
} 

public void setEnabled(Boolean enabled) { 
    this.enabled = enabled; 
} 

public int getCustomerId() { 
    return customerId; 
} 

public void setCustomerId(int customerId) { 
    this.customerId = customerId; 
} 

}

@Entity 

public class Behörden {

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private int authoritiesId; 
private String username; 
private String authority; 

public int getAuthoritiesId() { 
    return authoritiesId; 
} 

public void setAuthoritiesId(int authoritiesId) { 
    this.authoritiesId = authoritiesId; 
} 

public String getUsername() { 
    return username; 
} 

public void setUsername(String username) { 
    this.username = username; 
} 

public String getAuthority() { 
    return authority; 
} 

public void setAuthority(String authority) { 
    this.authority = authority; 
} 

}

@Entity 

public class Kunde implementiert Serializable {

private static final long serialVersionUID = 5140900014886997914L; 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private int customerId; 

@NotEmpty(message = "Nazwa użytkownika nie może pozostać pusta!") 

private String customerName; 

@NotEmpty(message = "Uzupełnij adres email!") 
private String customerEmail; 
private String customerPhone; 

@NotEmpty(message = "Nazwa użytkownika nie może pozostać pusta!") 
private String username; 

@NotEmpty(message = "Uzupełnij hasło!") 
@Size(min = 6, max = 16, message = "Hasło musi zawierać od 6 do 16 znaków!") 
private String password; 

private boolean enabled; 

@OneToOne(mappedBy = "customer", cascade = CascadeType.REMOVE) 
@JoinColumn(name = "billingAddressId") 
private BillingAddress billingAddress; 

@OneToOne(mappedBy = "customer", cascade = CascadeType.REMOVE) 
@JoinColumn(name = "shippingAddressId") 
private ShippingAddress shippingAddress; 

@OneToOne(cascade = CascadeType.REMOVE, mappedBy = "customer") 
@JoinColumn(name = "cartId") 
@JsonIgnore 
private Cart cart; 



public int getCustomerId() { 
    return customerId; 
} 

public void setCustomerId(int customerId) { 
    this.customerId = customerId; 
} 

public String getCustomerName() { 
    return customerName; 
} 

public void setCustomerName(String customerName) { 
    this.customerName = customerName; 
} 

public String getCustomerEmail() { 
    return customerEmail; 
} 

public void setCustomerEmail(String customerEmail) { 
    this.customerEmail = customerEmail; 
} 

public String getCustomerPhone() { 
    return customerPhone; 
} 

public void setCustomerPhone(String customerPhone) { 
    this.customerPhone = customerPhone; 
} 

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 boolean isEnabled() { 
    return enabled; 
} 

public void setEnabled(boolean enabled) { 
    this.enabled = enabled; 
} 

public BillingAddress getBillingAddress() { 
    return billingAddress; 
} 

public void setBillingAddress(BillingAddress billingAddress) { 
    this.billingAddress = billingAddress; 
} 

public ShippingAddress getShippingAddress() { 
    return shippingAddress; 
} 

public void setShippingAddress(ShippingAddress shippingAddress) { 
    this.shippingAddress = shippingAddress; 
} 

public Cart getCart() { 
    return cart; 
} 

public void setCart(Cart cart) { 
    this.cart = cart; 
} 

}

@Controller 

public class RegisterController {

@RequestMapping("/register") 
public String registerCustomer(Model model) { 
    Customer customer = new Customer(); 
    BillingAddress billingAddress = new BillingAddress(); 
    ShippingAddress shippingAddress = new ShippingAddress(); 
    customer.setBillingAddress(billingAddress); 
    customer.setShippingAddress(shippingAddress); 

    model.addAttribute("customer", customer); 
    return "registerCustomer"; 
} 

@Autowired 
private CustomerService customerService; 


@RequestMapping(value = "/register", method = RequestMethod.POST) 
public String registerCustomerPost(@Valid @ModelAttribute("customer") Customer customer, BindingResult result, 
     Model model) { 

    if (result.hasErrors()) { 
     return "registerCustomer"; 
    } 

    List<Customer> customerList = customerService.getAllCustomers(); 

    for (int i = 0; i < customerList.size(); i++) { 
     if (customer.getCustomerEmail().equals(customerList.get(i).getCustomerEmail())) { 
      model.addAttribute("emailMsg", "Email już istnieje w bazie danych!"); 

      return "registerCustomer"; 
     } 

     if (customer.getUsername().equals(customerList.get(i).getUsername())) { 
      model.addAttribute("usernameMsg", "Użytkownik o dane nazwie już istnieje w bazie!"); 

      return "registerCustomer"; 
     } 
    } 


    customer.setEnabled(true); 
    customerService.addCustomer(customer); 
    return "registerCustomerSuccess"; 
} 

}

@Repository 

@Transactional pub lic Klasse CustomerDaoImpl implementiert CustomerDao {

@Autowired 
private SessionFactory sessionFactory; 

public void addCustomer(Customer customer) { 
    Session session = sessionFactory.getCurrentSession(); 

    customer.getBillingAddress().setCustomer(customer); 
    customer.getShippingAddress().setCustomer(customer); 

    session.saveOrUpdate(customer); 
    session.saveOrUpdate(customer.getBillingAddress()); 
    session.saveOrUpdate(customer.getShippingAddress()); 

    Users newUser = new Users(); 
    newUser.setUsername(customer.getUsername()); 
    newUser.setPassword(customer.getPassword()); 
    newUser.setEnabled(true); 
    newUser.setCustomerId(customer.getCustomerId()); 

    Authorities newAuthority = new Authorities(); 
    newAuthority.setAuthority("ROLE_USER"); 
    session.saveOrUpdate(newUser); 
    session.saveOrUpdate(newAuthority); 
    newAuthority.setUsername(customer.getUsername()); 

    Cart newCart = new Cart(); 
    newCart.setCustomer(customer); 
    customer.setCart(newCart); 

    session.saveOrUpdate(customer); 
    session.saveOrUpdate(newCart); 

    session.flush(); 

} 

public Customer getCustomerById(int id) { 
    Session session = sessionFactory.getCurrentSession(); 
    Customer customer = (Customer) session.get(Customer.class, id); 
    session.flush(); 

    return customer; 
} 

public List<Customer> getAllCustomers() { 
    Session session = sessionFactory.getCurrentSession(); 
    Query query = session.createQuery("from Customer "); 
    List<Customer> customerList = query.list(); 

    return customerList; 

} 

public Customer getCustomerByUsername(String username) { 
    Session session = sessionFactory.getCurrentSession(); 
    Query query = session.createQuery("from Customer where username = ?"); 
    query.setString(0, username); 

    return (Customer) query.uniqueResult(); 
} 

public void deleteCustomer(Customer customer) { 
    Session session = sessionFactory.getCurrentSession(); 
    session.delete(customer); 
    session.flush(); 

} 

}

+0

Der Code, in dem Sie den Benutzer löschen, wäre nützlicher als die Entität. – dunni

Antwort

1

Sie haben zwischen Tabellen und setzen Aktion als (auf delete = Kaskade) für Fremdschlüssel hinzuzufügen.

+0

Zwischen Tischnutzer und Kunden? Wie es geht? –

1

Ihre Kundenentität hat keine Beziehung mit Benutzer- und Berechtigungstabellen, dann wird von jpa kein Löschen durchgeführt. EDIT In Kundenentität statt Benutzername Sie

@OneToOne(mappedBy="username", cascadeType=CascadeType.REMOVE) private User user 

Das gleiche gilt für Authories Unternehmen haben könnte:

@OneToOne(mappedBy="username", cascadeType=CascadeType.REMOVE) private User user 
+0

Welche Art von Beziehung sollte ich anwenden? Zwischen welchen Klassen oder Tabellen? –

+0

Ich kann den Benutzernamen nicht aus der Kundenklasse entfernen, da dies bei der Registrierung erforderlich ist. –

+0

Sie entfernen den Benutzernamen nicht, sondern kapseln ihn einfach im Benutzerobjekt über OneToOne Relarionship ein. – angcap

1

Auf Ihrer Meinung nach ist die Beziehung zwischen User und Kunden ist ein bis one.And Sie möchten den Benutzer löschen, wenn Sie den Kunden löschen.

Zuerst müssen wir die Beziehung explizit machen.

In der Benutzer Entität, empfehle ich Ihnen, die CustomerId zu entfernen, und Benutzer Benutzer zu Customer Entity hinzufügen.

Und der Kunde Entity wird:

private User user; 
public void setUser(User user){ 
    this.user = user; 
} 
@OneToOne 
public User getUser(){ 
    return this.user; 
} 

Danach können Sie die User des Kunden (userId) bekommen, und wenn Sie den Kunden löschen möchten, sollten Sie den Benutzer zuerst bekommen, dann löschen Kunde und löschen Sie diesen Benutzer

+0

Und was ist mit Modifikationen in anderen Klassen? –

Verwandte Themen