Hibernate CascadeType.ALL parece não funcionar

0 respostas
java
Matheus_Hernandes

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;
        }


    }
Criado 22 de junho de 2016
Respostas 0
Participantes 1