Сомневайся с обработкой схемы manyTomany и oneTomany перемешанные

Я делаю Веб проект управления событий для класса с , , , и .

Как я делаю, чтобы присоединять пользователей к событиям и обоим с таблицей окажи помощь?

Я хочу, чтобы приложение помнил, какой пользователь записался в какое событие и Вашу соответствующую присоединенную оплату, рассчитывая на то, что пользователь кроме того, что создавая событие, может оказывать помощь также в, также есть признак boolean администратор для того, чтобы он был единственным пользователем, который может удалять других пользователей или добавлять их.

Esquema BD Estructura del proyecto

Pojo Asiste:

@Entity
@Table(name = "asistentes")
@AssociationOverrides({
        @AssociationOverride(name = "primaryKey.usuario", joinColumns = @JoinColumn(name = "idUsuario")),
        @AssociationOverride(name = "primaryKey.evento", joinColumns = @JoinColumn(name = "idEvento")) })
public class Asiste {

// clave primaria-id compuesta

private UsuarioEventoId primaryKey = new UsuarioEventoId();

// campos adicionales
@Column(name = "nombreEntidad")
private String nombreEntidad;

@Column(name = "nombreCuenta")
private String nombreCuenta;

@Column(name = "iban")
private String iban;

@Column(name = "numeroCuenta")
private String numeroCuenta;

@Column(name = "fechaPago")
//@Temporal(TemporalType.DATE)
@Type(type="date")
private Date fechaPago;

Pojo Событие:

@Entity

@Table (ямс = "события") public class Событие {

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

@Column(name = "nombreEvento")
private String nombreEvento;

@Column(name = "tipoEvento")
private String tipoEvento;

@Column(name = "descripcionEvento")
private String descripcionEvento;

@Column(name = "precioEvento")
private double precioEvento;

@Column(name = "fechaCreacion")
private Date fechaCreacion;

@Column(name = "fechaCelebracion")
@Type(type="date")
private Date fechaCelebracion;

// Los días que faltan para que se cumpla el evento
@Column(name = "diasRestantes")
private long diasRestantes;

@Column(name = "iva")
private double iva;

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "usuario_id")
private Usuario usuario;

@OneToMany(mappedBy = "primaryKey.evento",fetch=FetchType.EAGER)
@Cascade(CascadeType.ALL)
@ElementCollection(targetClass=Integer.class)
private Collection<Asiste> listadoAsistentes;

Pojo Пользователь:

@Entity

@Table (ямс = "пользователи") public class Пользователь {

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

@Column(name = "nombreUsuario")
private String nombreUsuario;

@Column(name = "apellidosUsuario")
private String apellidosUsuario;

@Column(name = "contrasenia")
private String contrasenia;

@Column(name = "email")
private String email;

@Column(name = "administrador")
private boolean administrador;

@Column(name = "preguntaSecreta")
private String preguntaSecreta;

@Column(name = "respuestaSecreta")
private String respuestaSecreta;

// ¿Sería lo adecuado?
@Column(name = "sexo")
private String sexo;

// Primera relación 1 a * con la tabla Evento
@OneToMany(mappedBy="usuario",fetch=FetchType.EAGER)
@ElementCollection(targetClass=Integer.class)
private Collection<Evento> listadoEventos;

// Relación de 1 a * con la tabla Asiste
@OneToMany(mappedBy = "primaryKey.usuario",fetch=FetchType.EAGER)
@Cascade(CascadeType.ALL)
@ElementCollection(targetClass=Integer.class)
private Collection<Asiste> listadoAsistentes;

Pojo UsuarioEventoId (embeddable class)

@Embeddable
public class UsuarioEventoId implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;


    private Usuario usuario;


    private Evento evento;

    // Getters y Setters
    @ManyToOne
    @Cascade(CascadeType.ALL)
    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
    @ManyToOne
    @Cascade(CascadeType.ALL)
    public Evento getEvento() {
        return evento;
    }

    public void setEvento(Evento evento) {
        this.evento = evento;
    }

    @Override
    public String toString() {
        return "UsuarioEventoId [usuario=" + usuario + ", evento=" + evento + "]";
    }

Servlet form Пользователь

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        //response.getWriter().append("Served at: ").append(request.getContextPath());
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        request.setCharacterEncoding("UTF-8");

        String nombreUsuario = request.getParameter("nombreUsuario");
        String apellidosUsuario = request.getParameter("apellidosUsuario");
        String contrasenia = request.getParameter("contrasenia");
        String email = request.getParameter("email");
        String preguntaSecreta = request.getParameter("preguntaSecreta");
        String respuestaSecreta = request.getParameter("respuestaSecreta");
        String sexo = request.getParameter("sexo");

        GestionUsuarios gestionUsuarios = new GestionUsuarios();

        // No tengo muy claro si con los campos a null funcionará correctamente
        // cuando se agreguen los objetos a la lista
        Usuario usuario = new Usuario(nombreUsuario, apellidosUsuario, contrasenia, email, false, preguntaSecreta,
                respuestaSecreta, sexo, null, null);

        gestionUsuarios.addUsuario(usuario);

        request.setAttribute("usuarios", gestionUsuarios.list());

        //response.sendRedirect("app/tablaUsuarios.jsp");

        //response.sendRedirect("app/tablaUsuarios.jsp");
        //Había que tener aquí un dispather para que la tabla se mostrara
        request.getRequestDispatcher("tablaUsuarios.jsp").forward(request, response);


    }

Event form Servlet

protected void doPost(HttpServletRequest request, HttpServletResponse    response)
        throws ServletException, IOException {
    // TODO Auto-generated method stub
    // doGet(request, response);

    String nombreEvento = request.getParameter("nombreEvento");
    String tipoEvento = request.getParameter("tipoEvento");
    String descripcionEvento = request.getParameter("descripcionEvento");
    // Hacer el parseDouble
    String precioEvento = request.getParameter("precioEvento");

    double precioParseado = 0;
    try {
        precioParseado = Double.parseDouble(precioEvento);
    } catch (NullPointerException npe) {

    } catch (NumberFormatException nfe) {

    }

    // Fecha de creación: debe aparecer automáticamente
    Date fechaCreacion = new Date();

    // Fecha de celebración
    String fechaCeleb = request.getParameter("fechaCelebracion");

    DateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
    Date fechaCelebracion = null;
    try {
        fechaCelebracion = formatoFecha.parse(fechaCeleb);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    // De momento los días restantes estarán a null hasta que me de tiempo a
    // implementarlo(resta de fechas)
    String iva = request.getParameter("iva");

    double ivaParseado = 0;
    try {
        ivaParseado = Double.parseDouble(iva);
    } catch (NullPointerException npe) {

    } catch (NumberFormatException nfe) {

    }

    GestionEventos gestionEventos = new GestionEventos();



    Evento evento = new Evento(nombreEvento, tipoEvento, descripcionEvento, precioParseado, fechaCreacion,
            fechaCelebracion, 0, ivaParseado, null, null);


    gestionEventos.addEvento(evento);

    request.setAttribute("eventos", gestionEventos.list());

    request.getRequestDispatcher("tabla.jsp").forward(request, response);

}

and Помоги form Servlet

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub


    request.setCharacterEncoding("UTF-8");

    String nombreEntidad = request.getParameter("nombreEntidad");
    String nombreCuenta = request.getParameter("nombreCuenta");
    String iban = request.getParameter("iban");
    String numeroCuenta = request.getParameter("numeroCuenta");
    Date fechaPago = new Date();


    GestionAsistentes gestionAsistentes = new GestionAsistentes();

    // No tengo muy claro si con los campos a null funcionará correctamente
    // cuando se agreguen los objetos a la lista
    Asiste asistente = new Asiste(nombreEntidad, nombreCuenta, iban, numeroCuenta, fechaPago);

    gestionAsistentes.addAsistente(asistente);

    request.setAttribute("asistentes", gestionAsistentes.list());

    //response.sendRedirect("app/tablaUsuarios.jsp");

    //response.sendRedirect("app/tablaUsuarios.jsp");
    //Había que tener aquí un dispather para que la tabla se mostrara
    request.getRequestDispatcher("tablaAsiste.jsp").forward(request, response);


}
2
задан 18.08.2019, 08:46
1 ответ

Проблема состоит в том, что mapeo организаций неправильный.

Конкретно в mapeo помощников внутри pojo Evento.java ты используешь @ElementCollection этот тип mapeo используется только, когда тип снабженного ссылками элемента - слабая организация, которая зависит от первичной, чтобы существовать (у него нет собственного тождества), что заканчивает тем, что есть, основные или впитанные типы (embedabbles) в javadoc аннотации.

Этот тип mapeos появился с JPA 2, чтобы облегчать некоторым связи 1, где у элемента, снабженного ссылками никогда будет собственное тождество и только оно право того, чтобы быть присоединенным с сильной организацией. Например телефоны пользователя.

Нужно иметь в виду, что элементы, снабженные ссылками, будучи впитаны (с @Embbedable) это не могут быть организации (с @entity) а следовательно не могут ни сохраняться отдельно от сильной организации, с которой они соединены, ни вернуться базы данных независимо.

В твоем случае, прекращаясь @ElementCollection организация событие осталось бы:

@Entity
@Table(name = "eventos") 
public class Evento {

    ...otros campos...

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "primaryKey.evento",fetch=FetchType.EAGER)
    private Collection<Asiste> listadoAsistentes;
}

Заметь: Он не является очень рекомендуемым делать один fetch EAGER полных коллекций, из-за которых тебе может удаваться принести больше данных о базе данных, чем ты планировал.

Организация пользователь остался бы:

@Entity
@Table(name = "usuarios") 
public class Usuario {

    ...otros campos...

    // Primera relación 1 a * con la tabla Evento
    @OneToMany(mappedBy="usuario",fetch=FetchType.EAGER)
    private Collection<Evento> listadoEventos;

    // Relación de 1 a * con la tabla Asiste
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "primaryKey.usuario",fetch=FetchType.EAGER)
    private Collection<Asiste> listadoAsistentes;

}
0
ответ дан 03.12.2019, 22:14

Теги

Похожие вопросы