This sounds more like a standard 'Many to Many' mapping to me and it can be achieved as follows in my opinion..
class Task {
private Long id;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "task_incharge", joinColumns = { @JoinColumn(name = "task_id", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "person_id", referencedColumnName = "id") })
private Set<Person> personsInCharge;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "task_contributors", joinColumns = { @JoinColumn(name = "task_id", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "person_id", referencedColumnName = "id") })
private Set<Person> contributors;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "task_validators", joinColumns = { @JoinColumn(name = "task_id", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "person_id", referencedColumnName = "id") })
private Set<Person> validators;
}
Here we have three additional intermediate tables i.e. task_incharge, task_contributors and task_validators.
Similarly you need many-to-many collections in the Person class i.e.
private Set<Task> contributedTasks;
private Set<Task> validatedTasks;
private Set<Task> inchargeOf;
use same mapping tables for these as well just reverse the order of @JoinColumn inside @JoinTable to order inside