Méthode appropriée pour superposer le DAO basé sur Spring JPA à l'aide de Spring Boot Framework
Suis nouveau Printemps Boot & JPA...
Disons que j'ai deux entités mappées à deux tables qui sont jointes dans une base de données.
Étudiant-1------<-Cours
Aussi, permet de présumer que la base de données est déjà créé et rempli.
Cela montre qu'un élève a de nombreux cours...
Mon Étudiant De L'Entité:
@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
}
Mon Cours Entité:
@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
}
Au Printemps de Démarrage du Tutoriel Guides, il montre comment étendre un CrudRepository interface, mais
il ne précise pas comment l'installation d'un Ressort en fonction de DAO qui contient personnalisée finder méthodes qui utilisent les requêtes HQL et EntityManager à l'intérieur.
Est la suivante DAO et DaoImpl correct?
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();
}
}
Et ensuite dans le code du client, par exemple, dans la classe principale:
public class Application {
@Autowired
CustomerDao dao;
public static void main (String args []) {
List<Course> courses = dao.findCoursesByStudentName("John");
}
}
Est-ce la norme de façon à utiliser les requêtes HQL à l'intérieur de Printemps DAOs ? J'ai seend exemples de la @Transactional annotation d'être ajouté à la classe DAO est impl (par exemple CustomerDAOImpl) ?
S'il vous plaît laissez-moi savoir si c'est l'écriture, à la structure de mon Ressort de Démarrage de l'app ou suis-je censé étendre /ajouter à la CrudRepository seulement?
Si quelqu'un pouvait corriger mon exemple et me pointer vers une URL qui parle HQL l'aide d'Entités qui sont jointes, je vous serais très reconnaissant.
Le Printemps de Démarrage des guides de ne pas représenter les jointures ou DAOs - j'ai juste besoin de savoir comment créer correctement finder méthodes qui émulent instruction select qui renvoient des listes ou des structures de données.
Merci de prendre le temps de lire ceci...
source d'informationauteur PacificNW_Lover | 2015-04-01
Vous devez vous connecter pour publier un commentaire.
Si j'ai bien compris votre question correct, vous avez deux questions:
En ce qui concerne la première question, je tiens à préciser que c'est une question en ce qui concerne
spring-data-jpa
de l'utilisation d'Hibernate comme un fournisseur JPA, passpring-boot
.À l'aide de Données du Printemps j'ai l'habitude de sauter complètement de créer un DAO, mais directement utiliser un Référentiel d'étendre un standard comme
CrudRepository
. Si dans votre cas, vous n'avez même pas à écrire plus de code que:Qui sera suffisante et le Printemps de Données prendra soin de le remplir avec la mise en œuvre correcte si vous utilisez
dans votre classe de service. C'est là que j'ai aussi l'habitude d'annoter mes méthodes avec
@Transactional
pour s'assurer que tout fonctionne comme prévu.En ce qui concerne votre question sur les requêtes HQL s'il vous plaît examiner la spring data jpa documentationqui souligne que dans la plupart des cas, cela devrait être suffisant pour tenir à bonne nommé les méthodes de l'interface ou aller pour les requêtes nommées (section 3.3.3) ou utiliser le
@Query
annotation (section 3.3.4) pour définir manuellement la requête, par exemple, devrait travailler (n'ai pas essayé):Si vous annoter votre
CourseDaoImpl
avec@Transactional
(en Supposant que vous avez définiJpaTransactionManager
correctement), Vous pouvez simplement récupérer l'Étudiant avec le même nom et l'appeler legetCourses()
méthode de chargement différé des Cours rattachés à l'étudiant. DepuisfindCoursesByStudentName
sera exécuté dans une Transaction, il va charger le cours de l'amende juste.