Então percebi que quando temos uma entidade associativa e nessa entidade só temos as chaves estrangeiras usamos o ManyToMany, caso tenha algum campo diferente das chaves estrangeiras na associativa usamos o ManyToOne e OneToMany respectivamente.
Bom meu caso era o ManyToMany, então não preciso de uma classe associativa, no meu caso ResponsiblePermissions. Em fim, o erro era esse:
org.hibernate.MappingException: Could not determine type for: java.util.Set, at table: responsible, for columns: [org.hibernate.mapping.Column(permissions)]
O que acontece é que no mapeamento de minha classe a anotação @Id estava no get e o hibernate não encontrava a chave de minha classe então resolvi apenas colocando o @Id no meu campo chave privado. Segue as classes como ficaram:
Classe Permission
package br.com.mercadolivre.robot.domain;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
@Entity
@Table(name="permission")
public class Permission implements br.com.conrado.j4b.domain.Entity {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long identity;
private String robotName;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
name = "responsiblepermissions",
joinColumns = {
@JoinColumn(
name = "permissionsIdentity",
nullable = false,
updatable = false) },
inverseJoinColumns = {
@JoinColumn(
name = "responsibleIdentity",
nullable = false,
updatable = false) }
)
private Set<Responsible> responsibles = new HashSet<Responsible>();
public Long getIdentity() {
return identity;
}
public void setIdentity(Long identity) {
this.identity = identity;
}
public String getRobotName() {
return robotName;
}
public void setRobotName(String robotName) {
this.robotName = robotName;
}
/*public void addResponsiblePermissions(ResponsiblePermissions responsiblePermission) {
this.responsibles.add(responsiblePermission);
}
public void removeResponsiblePermissions(ResponsiblePermissions responsiblePermission) {
this.responsibles.remove(responsiblePermission);
}*/
public Set<Responsible> getResponsibles() {
return this.responsibles;
}
@Override
public int hashCode() {
return this.identity.hashCode();
}
@Override
public boolean equals(Object obj) {
return obj instanceof Permission && this.equals((Permission)obj);
}
private boolean equals(Permission other) {
return this.identity != null && this.identity.equals(other.identity);
}
}
Classe Responsible
package br.com.mercadolivre.robot.domain;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
@Entity
@Table(name="responsible")
public class Responsible implements br.com.conrado.j4b.domain.Entity {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long identity;
private String name;
private String login;
private String password;
private String passwordString;
private Date dateRegister;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
name = "responsiblepermissions",
joinColumns = {
@JoinColumn(
name = "responsibleIdentity",
nullable = false,
updatable = false) },
inverseJoinColumns = {
@JoinColumn(
name = "permissionsIdentity",
nullable = false,
updatable = false) }
)
private Set<Permission> permissions = new HashSet<Permission>();
public Long getIdentity() {
return identity;
}
public void setIdentity(Long identity) {
this.identity = identity;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Transient
public String getPasswordString() {
return passwordString;
}
public void setPasswordString(String passwordString) {
this.passwordString = passwordString;
}
@Temporal(value=TemporalType.TIMESTAMP)
public Date getDateRegister() {
return dateRegister;
}
public void setDateRegister(Date dateRegister) {
this.dateRegister = dateRegister;
}
/*public void addResponsablePermissions(Permission userPermission) {
this.responsiblesPermissions.add(userPermission);
}
public void removeResponsablePermissions(Permission userPermission) {
this.responsiblesPermissions.remove(userPermission);
}*/
public Set<Permission> getPermissions() {
return this.permissions;
}
@Override
public int hashCode() {
return this.identity.hashCode();
}
@Override
public boolean equals(Object obj) {
return obj instanceof Responsible && this.equals((Responsible)obj);
}
private boolean equals(Responsible other) {
return this.identity.equals(other.identity);
}
}
Se eu estiver errado em alguma coisa que escrevi, por favor, me fale par que eu tenha em mente o que é certo e não cometa erros.
Obrigado