Я делаю Веб проект управления событий для класса с java, jsp, hibernate, h2 и maven.
Как я делаю, чтобы присоединять пользователей к событиям и обоим с таблицей окажи помощь?
Я хочу, чтобы приложение помнил, какой пользователь записался в какое событие и Вашу соответствующую присоединенную оплату, рассчитывая на то, что пользователь кроме того, что создавая событие, может оказывать помощь также в, также есть признак boolean
администратор для того, чтобы он был единственным пользователем, который может удалять других пользователей или добавлять их.
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 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 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 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);
}
Проблема состоит в том, что 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;
}