https://github.com/MiloszFilimowski/sknera/blob/master/src/main/java/com/filimowski/dao/PersonDAO.java
wywal z metod dodaj na klasie, DRY
@Repository
@Transactional
public class PersonDAO {
@PersistenceContext
EntityManager entityManager;
@Transactional
public void assignProduct(Long personId, Long productId) {
Query query = entityManager.createNativeQuery("insert into expenses (id_person,id_product) values(?1,?2)")
.setParameter(1, personId).setParameter(2, productId);
query.executeUpdate();
}
mondre ksionsszki mówią że "Named queries are a powerful tool for organizing query definitions and improving application performance. "
"Pro JPA 2 Mastering the Java Persistence API" znajdziesz pdf;a
Query query = entityManager.createNativeQuery("SELECT * FROM person where email = \"" + email + "\"",
Person.class);
sry ?
-
https://github.com/MiloszFilimowski/sknera/blob/master/src/main/java/com/filimowski/dao/Person.java
po co to ?
-
https://github.com/MiloszFilimowski/sknera/blob/master/src/main/java/com/filimowski/dao/ProductDAO.java
dlaczego EntityManager entityManager; ma default scopa ? powinno być private
@Transactional
public List<Product> getProductList(Long personID) {
List<Product> productList;
Query query = entityManager.createNativeQuery(
"select * from products inner join expenses on expenses.id_product=products.id where expenses.id_person="
+ personID.toString(),Product.class);
productList = query.getResultList();
System.out.println(productList);
return productList;
}
ten productList powinien być definiowany od razu przy użyciu, nie możesz definiować "na potem" , Effective java This is Item 45
System.out.println(productList);
poczytaj o loggerach
https://github.com/MiloszFilimowski/sknera/tree/master/src/main/java/com/filimowski
jak już masz package to używaj wszędzie, zrób sobie package na dto, na modele
Tu jest fajniej :D
if (!result.hasErrors() && request.getMethod().equalsIgnoreCase("post")) {
Person person = new Person();
person.setName(form.getName());
person.setEmail(form.getEmail());
person.setPassword(form.getPassword());
person.setRole("ROLE_USER");
person.setEnabled(true);
personDAO.addPerson(person);
return "redirect:/login?register=1";
} else {
return "form";
}
ta validacja, tworzenie person powinno iść do jakiegoś serwisu, wgl ... btw dlaczego w metodzie która odbiera GET'a sprawdzasz czy request jest postem ? to się nigdy nie stanie ?? o.0 ?
ta metoda powinna wyglądać mniej wiecej tak
@RequestMapping(value = "/form", method=POST) // to nie zadziala, poszukaj jak sie definiuje posta W SPRING MVC
public String obsluzFormularz(HttpServletRequest request, @ModelAttribute("form") @Valid FormularzDTO form,
BindingResult result) {
userService.saveUser(form); // i to moze wywalic wyjatek jakby cos poszlo nie tak, wyjatek tez moze przechowywać stan tego obiektu
return "widok";
}
a wyjątek który wyrzuci może być łapany przez advice controller, jak np:
@ControllerAdvice
public class ExceptionHandlerController {
@ExceptionHandler(NoResourceFoundException.class)
public String handleNoResourceFoundException(){
return Views.Exceptions.resourceNotFound;
}
}
e @Shalom @Koziołek @furious programming jakby wywalić wyjątek z takiego serwisu i w tym wyjątku zapisać stan tego usera ktory jest zły, żeby go potem użyć, to by było ok czy raczej nie ?
EDIT
według jakieś mądrej głowy z dużą ilością pkt można http://stackoverflow.com/questions/7714405/exception-with-multiple-parameters-in-the-constructor