Soy nuevo en la Primavera de Inicio & JPA…

Digamos que tengo dos entidades a las que se asignan a dos tablas que están unidos en una base de datos.

Estudiante-1——<-Curso de

También, permite suponer que la base de datos ya está creada y poblada.

Esto representa que un estudiante tiene muchos cursos…

Mi Estudiante Entidad:

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

Mi Curso De Entidad:

@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

}

En la Primavera de de Inicio del Tutorial de Guías, ilustra cómo extender un CrudRepository interfaz, pero
no especifica cómo la instalación de una Primavera basado DAO que contiene personalizado buscador de métodos que utilizan HQL y EntityManager en su interior.

Es la siguiente DAO y DaoImpl correcto?

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

Y, a continuación, en el código de cliente, por ejemplo, en la clase principal:

 public class Application {

    @Autowired
    CustomerDao dao;

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

Es esta la manera estándar de uso HQL dentro de la Primavera DAOs ? He seend ejemplos de la @Transactional anotación se antepone el DAO de la clase de eventos (por ejemplo, CustomerDAOImpl) ?

Por favor, hágamelo saber si esta es la escritura la manera de estructurar mi Primavera de Inicio de la aplicación o se supone que voy a extender /añadir a la CrudRepository sólo?

Si alguien pudiera corregir mi ejemplo y me apunte a una URL que habla sobre HQL el uso de las Entidades que se unen, le estaría muy agradecido.

La Primavera de Arranque guías no representan las combinaciones o DAOs – sólo necesito aprender cómo crear correctamente el buscador de métodos que simulan instrucción select que devuelven listas o estructuras de datos.

Gracias por tomarse el tiempo de leer esto…

OriginalEl autor PacificNW_Lover | 2015-04-01

2 Comentarios

  1. 11

    Si he entendido tu pregunta correcta, tenemos dos preguntas:

    1. Cómo crear un DAO y DAOImpl?
    2. Donde poner tu Transacción anotaciones?

    En lo que respecta a la primera pregunta, quiero señalar que esta es una cuestión en lo que respecta a spring-data-jpa usando Hibernate como JPA proveedor, no spring-boot.

    Utilizando la Primavera de Datos que por lo general no completamente para crear un DAO pero directamente usar un Repositorio de extensión de un estándar como CrudRepository. Así que en el caso de que usted incluso no tiene que escribir más código que:

    @Repository
    public interface StudentRepository extends CrudRepository<Student, Long> {
    
        List<Student> findByStudentName(String studentName);
    
    }

    Que será suficiente y la Primavera de Datos se encargará de llenar con la correcta aplicación si utiliza

    @Autowired
    StudentRepository studentRepo; 

    en su clase de servicio. Aquí es donde yo también suelen anotar mis métodos con @Transactional para asegurarse de que todo está funcionando como se esperaba.

    En lo que respecta a su pregunta sobre HQL por favor, busque en el spring data jpa documentación, que señala que para la mayoría de los casos debe ser suficiente para pegarse a la correcta métodos mencionados en la interfaz o ir para las consultas con nombre (sección 3.3.3) o el uso de la @Query anotación (sección 3.3.4) para definir manualmente la consulta, por ejemplo, debería funcionar (no probado):

    @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);
    
    }
    cual es mejor? JPA o Cruid repositorio? ¿se puede utilizar el repositorio? la última vez que he usado hibernar no ware primavera 2,5 y 3 de hibernación, no sólo he olvidado de qué se trataba, yo también no uso de estas característica, antes de que recién a verlos en youtube…
    JPARepository es en realidad la herencia de CRUDRepository por lo que es un tipo específico para lidiar con JPA Pojos. Consulte docs.de la primavera.io/primavera-datos/jpa/docs/actual/api/org/…
    muchas gracias, ‘<S se extiende T> S saveAndFlush(S entidad)’ :O no de la operación de guardar dentro de las operaciones crud, realizar todas las guarda los cambios en la base de datos?

    OriginalEl autor daniel.eichten

  2. 1

    Si usted anotar su CourseDaoImpl con @Transactional (Asumiendo que la han definido JpaTransactionManager correctamente) puede recuperar el Estudiante con el mismo nombre y llamar a la getCourses() método de carga perezoso de los Cursos que se adjunta a ese estudiante. Desde findCoursesByStudentName se ejecute dentro de una Transacción será la carga de los cursos de bien.

    @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>();
        }
    }   
    shazin, gracias por responder… Es esta la manera estándar de hacer HQL? Usted está haciendo un select de los Estudiantes y no de la combinación? Estoy confundido… También, ¿por qué la readOnly=true? ¿Qué significa definir JpaTransactionManager correctamente? ¿Cómo lo harían en la Primavera de Arranque? ¿Por qué no utilizar el CrudRespository? Lo que estoy buscando es la manera estándar de hacer las cosas… Gracias por tu ayuda.
    De donde es esta clase de Usuario / objeto ref definido? Did you mean Estudiante?

    OriginalEl autor shazin

Dejar respuesta

Please enter your comment!
Please enter your name here