Am neuen Spring-Boot & JPA ...richtige Weg Frühling JPA basiert DAO mit Spring-Boot-Rahmen
Lassen Sie uns sagen, ich habe zwei Einheiten auf zwei Tabellen zugeordnet Schicht, die in einer Datenbank verbunden sind.
Schüler-1 ------ < -Kurs
Auch lässt vermuten, dass die Datenbank bereits erstellt und mit Daten gefüllt ist.
Dies zeigt, dass ein Schüler viele Kurse ...
Mein Studenten Entity hat:
@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
}
My Course Entity:
@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
}
Im Frühjahr Boot-Tutorial Guides, es zeigt, wie um eine CrudRepository-Schnittstelle zu erweitern, aber wird nicht angegeben, wie ein Spring-based DAO eingerichtet wird, das benutzerdefinierte Finder-Methoden enthält, die HQL und Entität verwenden yManager drin.
Sind die folgenden DAO und DaoImpl korrekt?
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();
}
}
Und dann im Client-Code, zum Beispiel in der Hauptklasse:
public class Application {
@Autowired
CustomerDao dao;
public static void main (String args []) {
List<Course> courses = dao.findCoursesByStudentName("John");
}
}
Ist dies der normale Weg HQL innerhalb Frühlings DAOs zu benutzen? Ich habe Beispiele der @Transactional Annotation, die dem Impl der DAO-Klasse vorangestellt ist (z. B. CustomerDAOImpl)?
Bitte lassen Sie mich wissen, wenn dies die Schreibweise ist, um meine Spring Boot App zu strukturieren, oder soll ich nur das CrudRepository erweitern/ergänzen?
Wenn jemand mein Beispiel korrigieren und mich auf eine URL verweisen könnte, die über HQL mit Entitäten spricht, die verbunden sind, wäre ich sehr dankbar.
Die Spring Boot-Guides zeigten keine Joins oder DAOs - ich muss nur lernen, wie man Finder-Methoden erstellt, die select-Anweisungen emulieren, die Listen oder Datenstrukturen zurückgeben.
Vielen Dank für die Zeit nehmen, diese zu lesen ...
shazin, danke für die Antwort ... Ist das der Standard Weg, um HQL zu tun? Sie machen eine Auswahl von Studenten und nicht die beitreten? Ich bin verwirrt ... Und warum ist readOnly = true? Was meinst du JpaTransactionManager richtig definieren? Wie würdest du das in Spring Boot machen? Warum nicht das CrudRespository benutzen? Was ich suche, ist die übliche Art, Dinge zu tun ... Danke für deine Hilfe. –
Wo ist diese Benutzerklasse/Objektref definiert? Meinst du Student? –