Witam,
potrzebuje teoretycznej porady, stosownego opisu do problemu, którego jeszcze sam nie zbyt dobrze umiem zdefiniować. Tworzę aplikację i w żaden sposób nie mogę powiązać danych z wielu tabel, tak by przy np. zapisie danych uwierzytelniających użytkownika, móc się potem do nich odwołać z nowej klasy. Tak, stosowny model danych istnieje ale umiem zapisać tylko dwie z tabel wykorzystując klasy encyjne i beany. Powiązałem sobie role i dane uwierzytelniające (z różnych tabel) za pomocą @SecondaryTable, okej. Pozostało mi jeszcze pięć tabel z danymi biznesowymi, które są w relacji @ManyToOne do tabeli z głównymi danymi użytkownika. Stosuje wzorzec fasada i endpointy.
public class Users implements Serializable
{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Integer userId;
@Column(name = "login", unique = true)
private String login;
@Column(name = "password")
private String password;
@Column(name = "email", unique = true)
private String email;
@Column(name = "role_name", table = "roles", unique = false, nullable = true, updatable = true)
private String roleName;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "userId", fetch = FetchType.EAGER)
private List<Qualifications> qualificationsCollection = new ArrayList<Qualifications>();
@OneToMany(cascade = CascadeType.ALL, mappedBy = "userId", fetch = FetchType.EAGER)
private List<HistoryWork> historyWorkCollection = new ArrayList<HistoryWork>();
@OneToMany(cascade = CascadeType.ALL, mappedBy = "userId", fetch = FetchType.EAGER)
private List<Education> educationCollection = new ArrayList<Education>();
@OneToMany(cascade = CascadeType.ALL, mappedBy = "userId", fetch = FetchType.EAGER)
private List<Trainings> trainingsCollection = new ArrayList<Trainings>();
@OneToMany(cascade = CascadeType.ALL, mappedBy = "userId", fetch = FetchType.EAGER)
private List<Workers> workersCollection = new ArrayList<Workers>();
...}
public class Trainings implements Serializable
{
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Column(name = "id")
private Integer id;
@Column(name = "training_begin")
@Temporal(TemporalType.DATE)
private Date trainingBegin;
@Column(name = "training_end")
@Temporal(TemporalType.DATE)
private Date trainingEnd;
@Size(max = 500)
@Column(name = "content_training")
private String contentTraining;
@Column(name = "training_time")
private Short trainingTime;
@JoinColumn(name = "user_id", referencedColumnName = "user_id")
@ManyToOne(optional = false, fetch = FetchType.EAGER)
...}
@Stateless
public class UsersFacade extends AbstractFacade<Users>
{
@PersistenceContext(unitName = "System.PU")
private EntityManager em;
@Override
protected EntityManager getEntityManager()
{
return em;
}
public UsersFacade()
{
super(Users.class);
}
}
@Stateful
public class UsersEndpoint
{
@EJB
private UsersFacade usersFacade;
//private Object user;
public void addUser(Users user)
{
usersFacade.create(user);
}
public List<Users> getUsersList()
{
return usersFacade.findAll();
}
public void addUserBeforeEditing(Users addedUser)
{
usersFacade.edit(addedUser);
}
public Users downloadUserToEdit(Users user)
{
Users wanted_user = usersFacade.find(user.getUserId());
return wanted_user;
}
public void removeUser(Users user)
{
usersFacade.remove(user);
}
}
@SessionScoped
public class UsersController implements Serializable
{
@EJB
private UsersEndpoint usersEndpoint;
private Users addedUser;
public Users getAddedUser()
{
return addedUser;
}
public void setAddedUser(Users addedUser)
{
this.addedUser = addedUser;
}
public void addUser()
{
if(addedUser == null)
{
throw new IllegalArgumentException("Próba dodania nowego użytkownika z pominięciem formularza");
}
usersEndpoint.addUser(addedUser);
addedUser = null;
}
...}
Przedstawiam fragment kodu programu, jest prosty a ja pewnych rzeczy po prostu nie potrafię nazwać, gdyż stykam się z nimi po raz pierwszy.