2015-04-01 26 views
10

jestem nowy Wiosna Boot & WZP ...właściwy sposób do warstwy Wiosna WZP w oparciu DAO przy użyciu Spring Framework Boot

Powiedzmy mam dwa podmioty mapowane do dwóch tabel, które są połączone w bazie danych.

Student-1 ------ < -Course

Ponadto, pozwala przypuszczać, że baza danych jest już utworzony i zaludnionych.

To pokazuje, że jeden uczeń ma wiele kursów ...

My Student Podmiot:

@Entity 
public class Student { 

    @OneToMany(mappedBy="student") 
    private List<Courses> courses; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "Student_Id") 
    private long studentId; 

    @Column(name = "Student_Name") 
    private String studentName; 

    protected Student() { } 

    // Getters & Setters 
} 

mojego kursu jednostki:

@Entity 
public class Course { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "Course_Id") 
    private long courseId; 

    @Id 
    @Column(name = "Student_Id") 
    private long studentId; 

    @ManyToOne 
    @PrimaryKeyJoinColumn(name="Student_Id", referencedColumnName="Student_Id") 
    private Student student; 

    @Column(name = "Course_Name") 
    private String courseName; 

    // Getters & Setters 

} 

na wiosnę osłonowego pomog, to pokazuje, jak w celu rozszerzenia interfejsu CrudRepository, ale nie określa sposobu konfigurowania DAO opartego na Spring, który zawiera niestandardowe metody wyszukiwania, które wykorzystują HQL i Entit y Manager w środku.

Czy następujące DAO i DaoImpl są prawidłowe?

public interface CourseDao { 
    List<Course> findCoursesByStudentName(String studentName); 
} 

@Repository 
public class CourseDaoImpl implements CourseDao { 

    @PersistenceContext 
    EntityManager em; 

    public List<Course> findCoursesByStudentName(String studentName) { 
     String sql = "select c.courseName" + 
        "from Course c, Student s " + 
        "where c.course_id = s.student_id " + 
        "and s.studentName = :studentName "; 

     Query query = em.createQuery(sql); 
     query.setParameter("studentName", studentName); 
     return query.getResultList(); 
    } 
} 

A potem w kodzie klienta, na przykład, w głównej klasie:

public class Application { 

    @Autowired 
    CustomerDao dao; 

    public static void main (String args []) { 
     List<Course> courses = dao.findCoursesByStudentName("John"); 
    } 
} 

Jest to standardowy sposób użyć HQL wewnątrz Wiosna DAOs? Przygotowałem przykłady adnotacji @Transactional, która została dodana do implantów klasy DAO (na przykład CustomerDAOImpl)?

Proszę dać mi znać, jeśli jest to sposób zapisu do struktury mojej aplikacji Spring Boot lub czy mam rozszerzyć/dodać tylko do CrudRepository?

Jeśli ktoś mógłby poprawić mój przykład i wskazać mi adres URL, który mówi o HQL przy użyciu elementów, które są połączone, byłbym bardzo wdzięczny.

Przewodniki Spring Boot nie przedstawiały złączeń ani DAO - po prostu muszę się nauczyć, jak prawidłowo tworzyć metody wyszukiwania, które emulują instrukcję select, która zwraca listy lub struktury danych.

Dzięki za poświęcenie czasu na przeczytanie tego ...

Odpowiedz

1

Jeśli opisywania CourseDaoImpl z @Transactional (zakładając, że zostały zdefiniowane JpaTransactionManager poprawnie) można tylko pobrać student z nazwą dopasowania i wywołać metodę getCourses() leniwy załaduj Kursy dołączone do tego ucznia. Ponieważ findCoursesByStudentName będzie działać w ramach transakcji, ładowanie kursów będzie w porządku.

@Repository 
@Transactional(readOnly=true) 
public class CourseDaoImpl implements CourseDao { 

    @PersistenceContext 
    EntityManager em; 

    public List<Course> findCoursesByStudentName(String studentName) { 
     String sql = "select s " + 
        "from Student s " + 
        "where s.studentName = :studentName "; 

     Query query = em.createQuery(sql); 
     query.setParameter("studentName", studentName); 
     User user = query.getSingleResult(); 
     if(user != null) { 
      return user.getCourses(); 
     } 

     return new ArrayList<Course>(); 
    } 
} 
+0

shazin, dzięki za odpowiedź ... Czy to standardowy sposób na wykonywanie HQL? Robisz wybranych studentów, a nie dołączyć? Jestem zdezorientowany ... Również dlaczego readOnly = true? Co masz na myśli zdefiniować poprawnie JpaTransactionManager? Jak to zrobiłbyś w Spring Boot? Dlaczego nie skorzystać z CrudRespository? To, czego szukam, to standardowy sposób robienia rzeczy ... Dziękuję za pomoc. –

+0

Gdzie jest zdefiniowana pozycja Ref użytkownika klasy/obiektu? Miałeś na myśli Student? –

10

Gdybym zrozumiał swoje pytanie poprawnego ty masz dwa pytania:

  1. Jak stworzyć DAO i DAOImpl?
  2. Gdzie umieścić adnotacje o transakcjach?

W odniesieniu do pierwszego pytania pragnę podkreślić, że jest to pytanie w odniesieniu do spring-data-jpa użyciu Hibernate jako dostawca JPA, nie spring-boot.

Używanie danych sprężystych Zazwyczaj pomijam całkowicie tworzenie DAO, ale bezpośrednio używam repozytorium niestandardowego rozszerzającego standardową wersję, taką jak CrudRepository. Więc w twoim przypadku nawet nie trzeba pisać więcej kodu niż:

@Repository 
public interface StudentRepository extends CrudRepository<Student, Long> { 

    List<Student> findByStudentName(String studentName); 

} 

który będzie wystarczający i wiosna danych zadba o wypełnienie jej prawidłowej realizacji, jeśli używasz

@Autowired 
StudentRepository studentRepo; 

w twojej klasie usług. Tam też zazwyczaj opisuję swoje metody za pomocą @Transactional, aby upewnić się, że wszystko działa zgodnie z oczekiwaniami.

Jeśli chodzi o twoje pytanie dotyczące HQL, spójrz na numer spring data jpa documentation, który wskazuje, że w większości przypadków powinno wystarczyć użycie odpowiednich nazwanych metod w interfejsie lub wyszukiwanie nazwanych zapytań (sekcja 3.3.3) lub użyj adnotacji @Query (sekcja 3.3.4), aby ręcznie zdefiniować zapytanie, np. powinien działać (nie próbował):

@Repository 
public interface @CourseRepository extends CrudRepository<Course, Long> { 

    @Query("select c.courseName from Course c, Student s where c.course_id = s.student_id and s.studentName = :studentName") 
    public List<Course> findCoursesByStudentName(String studentName); 

} 
+0

co jest lepsze? JPA lub Cruid repozytorium? czy możemy po prostu użyć repozytorium? Ostatni raz użyłem hibernacji tam ware spring 2.5 i hibernacji 3, nie tylko zapomniałem o co chodziło, ja też nie korzystałem z tej funkcji, zanim niedawno zobaczyłem je na youtube ... – deadManN

+1

'JPARepository' faktycznie dziedziczy z' CRUDRepository', więc jest to specyficzny typ do obsługi JPA Pojos. Zobacz http://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/JpaRepository.html –

+0

wielkie dzięki, ' S saveAndFlush (S entity)' : O nie zapisuje operacji w crud, wykonaj wszystkie zapisuje zmiany w bazie danych? – deadManN