Estou trabalhando em uma aplicação em Java Spring onde tenho de fazer um sistema de permissões granulares para usuário, no processo é cadastrado programas (Cada tela do sistema) e permissões por programas (Inserir,remover,etc). Neste contexto o programa é uma entidade que contém uma coleção de permissões, outra entidade, e na situação de inserção nenhum destes possui uma ID ainda.
O exemplo da situação foi bem explicado no Caelum neste post
No entanto mesmo a anotação ele insiste em gerar um TransientObjectException
Eu não consigo enxergar o que pode estar faltando, alguém tem como me dar uma ajuda com isso?
O código save e as classes seguem a baixo:
@Transactional(readOnly = false)
public void create(Programa programa) {
for (ProgramaPermissao pp : programa.getProgramaPermissaoList()) {
if (pp.getParentPrograma() == null) {
pp.setParentPrograma(programa);
}
}
//trataSistema(programa);
programaDao.create(programa);
}
@Entity
@Table(name = "ADMSIS003")
public class Programa implements Serializable, Comparable<Programa> {
private Long id;
private String nome;
private String icone;
private String url;
private String role;
private Programa programaPai;
private Sistema sistema;
private List<ProgramaPermissao> programaPermissaoList = new ArrayList<ProgramaPermissao>();
private UsuarioSistema usuInclusao;
private Date dataInclusao;
private UsuarioSistema usuAlteracao;
private Date dataAlteracao;
@Id
@TableGenerator(name = "admsis003_gen",
table = "ADMSIS000",
pkColumnName = "TABELA",
pkColumnValue = "ADMSIS003",
valueColumnName = "VALOR",
allocationSize = 1)
@GeneratedValue(strategy = GenerationType.TABLE, generator = "admsis003_gen")
@Column(name = "SIS003_CODIGO")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name = "NOME", nullable = false)
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
@Column(name = "ICONE")
public String getIcone() {
return icone;
}
public void setIcone(String icone) {
this.icone = icone;
}
@Column(name = "URL")
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
@Column(name = "ROLE")
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "SIS003_CODIGO_PAI")
public Programa getProgramaPai() {
return programaPai;
}
public void setProgramaPai(Programa programaPai) {
this.programaPai = programaPai;
}
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "SIS002_CODIGO", nullable = false)
public Sistema getSistema() {
return sistema;
}
public void setSistema(Sistema sistema) {
this.sistema = sistema;
}
@Cascade({org.hibernate.annotations.CascadeType.ALL})
@OneToMany(fetch = FetchType.LAZY, orphanRemoval = true, mappedBy = "parentPrograma")
@Fetch(FetchMode.SUBSELECT)
public List<ProgramaPermissao> getProgramaPermissaoList() {
return programaPermissaoList;
}
public void setProgramaPermissaoList(List<ProgramaPermissao> programaPermissaoList) {
this.programaPermissaoList = programaPermissaoList;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "SIS003_AUT001_CRIOU", referencedColumnName = "SIS001_CODIGO", nullable = true)
@JsonIgnore
public UsuarioSistema getUsuInclusao() {
return usuInclusao;
}
public void setUsuInclusao(UsuarioSistema usuInclusao) {
this.usuInclusao = usuInclusao;
}
@Column(name = "DATA_INCLUSAO")
@Temporal(TemporalType.TIMESTAMP)
public Date getDataInclusao() {
return dataInclusao;
}
public void setDataInclusao(Date dataInclusao) {
this.dataInclusao = dataInclusao;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "SIS003_AUT001_ALTEROU", referencedColumnName = "SIS001_CODIGO", nullable = true)
@JsonIgnore
public UsuarioSistema getUsuAlteracao() {
return usuAlteracao;
}
public void setUsuAlteracao(UsuarioSistema usuAlteracao) {
this.usuAlteracao = usuAlteracao;
}
@Column(name = "DATA_ALTERACAO")
@Temporal(TemporalType.TIMESTAMP)
public Date getDataAlteracao() {
return dataAlteracao;
}
public void setDataAlteracao(Date dataAlteracao) {
this.dataAlteracao = dataAlteracao;
}
}
@Entity
@Table(name = "ADMSIS015")
public class ProgramaPermissao implements Serializable, Comparable<ProgramaPermissao> {
private Long id;
private Programa parentPrograma;
private String nome;
private String role;
@Id
@TableGenerator(name = "admsis015_gen",
table = "ADMSIS000",
pkColumnName = "TABELA",
pkColumnValue = "ADMSIS015",
valueColumnName = "VALOR",
allocationSize = 1)
@GeneratedValue(strategy = GenerationType.TABLE, generator = "admsis015_gen")
@Column(name = "SIS015_CODIGO")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "SIS003_CODIGO")
public Programa getParentPrograma() {
return parentPrograma;
}
public void setParentPrograma(Programa parentPrograma) {
this.parentPrograma = parentPrograma;
}
@Column(name = "NOME", nullable = false)
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
@Column(name = "ROLE", nullable = false)
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
}