2015-04-01 28 views
10

是新來的春天引導& JPA到層基於Spring DAO JPA ...正確的方法使用Spring框架啓動

比方說,我有映射到其在數據庫中加入兩個表的兩個實體。

學生-1 ------ <道菜的

而且,讓假定數據庫已創建並填充。

這描述了一個學生有很多課程...

我的學生實體:

@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 
} 

我的課程實體:

@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 

} 

在春天啓動的教程指導,它闡釋瞭如何擴展CrudRepository接口,但它不指定如何設置基於Spring的DAO,其中包含使用HQL和Entit的自定義查找程序方法yManager裏面。

下面的DAO和DaoImpl是否正確?

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

然後在客戶端的代碼,例如,在主類:

public class Application { 

    @Autowired 
    CustomerDao dao; 

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

這是標準的方式來使用HQL春天的DAO裏面?我已經看到了DAO類的impl(例如CustomerDAOImpl)前綴的@Transactional註釋示例?

請讓我知道如果這是寫入方式來構建我的Spring Boot應用程序,或者我應該只擴展/添加到CrudRepository?

如果有人可以糾正我的例子,並指向我使用加入的實體談論HQL的URL,我將非常感激。

Spring Boot指南沒有描述連接或DAO - 我只需要學習如何正確地創建查找方法來模擬返回列表或數據結構的select語句。

感謝您抽空閱讀本文時...

回答

1

如果你的註釋與CourseDaoImpl@Transactional(假設你的正確定義JpaTransactionManager)你可以只檢索與匹配名學生,並調用getCourses()方法延遲加載該學生所附的課程。由於findCoursesByStudentName將在事務中運行,因此它將加載課程。

@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,謝謝你的迴應...這是做HQL的標準方式嗎?你正在選擇學生而不是加入?我很困惑...另外,爲什麼readOnly = true?你是什​​麼意思定義JpaTransactionManager正確?你如何在Spring Boot中做到這一點?爲什麼不使用CrudRespository?我正在尋求的是做事情的標準方式......感謝您的幫助。 – 2015-04-01 01:37:43

+0

此用戶類/對象ref在何處定義?你是指學生嗎? – 2015-04-01 17:40:43

10

如果我明白你的問題正確的你有兩個問題:

  1. 如何創建一個DAO和DAOImpl?
  2. 何處放置交易註釋?

在問候我想指出的是,這是使用Hibernate作爲JPA提供者,而不是spring-bootspring-data-jpa問候提問的第一個問題。

使用Spring數據我通常會完全跳過來創建一個DAO,但直接使用一個自定義存儲庫來擴展一個像CrudRepository這樣的標準存儲庫。所以你的情況,你甚至不用編寫更多的代碼比:

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

    List<Student> findByStudentName(String studentName); 

} 

這將是足夠的,如果你使用

@Autowired 
StudentRepository studentRepo; 

春天的數據將採取與正確實施填充它的護理在你的服務班。這也是我通常用@Transactional註釋我的方法以確保一切按預期工作的地方。

關於您對HQL的問題,請查看spring data jpa documentation,其中指出,對於大多數情況下,應該足以在界面中使用正確的命名方法或進行命名查詢(見第3.3.3節)或使用@Query註釋(第3.3.4節)手動定義查詢,例如應該工作(沒有嘗試過):

@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

哪個更好? JPA或Cruid存儲庫?我們可以只使用存儲庫嗎?我上次用hibernate的時候有ware 2.5和hibernate 3,不只是我忘了它是什麼,我也沒有使用這些功能,然後纔在YouTube上看到它們...... – deadManN 2016-11-16 10:41:20

+1

'JPARepository'實際上是從' CRUDRepository',因此它是處理JPA Pojos的特定類型。見http://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/JpaRepository.html – 2016-11-16 10:48:19

+0

非常感謝,' S saveAndFlush(S entity)' :O不保存在crud中的操作,對數據庫執行所有保存更改? – deadManN 2016-11-16 10:54:57