Hibernate一对多JoinTable无法正常工作

时间:2014-04-04 12:10:15

标签: java spring hibernate jpa primefaces

大家!!我有一个使用以下技术的项目:

  • JPA 2.1
  • Hibernate 4
  • 春季3
  • Orika 1.45
  • Oracle 11g
  • JSF 2.1
  • Primefaces 4

所以,我有两个实体:Curso.java和Material.java。每个Curso都可以有各种Material,所以我创建了实体MaterialCurso.java。下面是Classes的代码。 PS:我使用DTO课程。

Curso.java。

    @Entity  
    @Table(name = "CURSO")  
    @NamedQueries({  
    @NamedQuery(name = "Curso.findAll", query = "SELECT c FROM Curso c "),  
    @NamedQuery(name = "Curso.findByNomeCurso", query = "SELECT c FROM Curso c where c.nomeCurso = :nomeCurso  ") })  
    public class Curso extends BaseEntity<CursoDTO> {  
        private static final long serialVersionUID = 1L;  

        @Id  
        @SequenceGenerator(name = "CURSO_IDCURSO_GENERATOR", sequenceName = "SEQ_CURSO")  
        @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CURSO_IDCURSO_GENERATOR")  
        @Column(name = "ID_CURSO", unique = true, nullable = false)  
        private Long idCurso;  

        @Column(name = "ABREV_CURSO", nullable = false, length = 100)  
        private String abrevCurso;  

        @Column(name = "CARGA_HORARIA_CURSO", nullable = false)  
        private Long cargaHorariaCurso;  

        @Column(name = "NOME_CURSO", nullable = false, length = 200)  
        private String nomeCurso;  

        // bi-directional many-to-one association to Unidade  
        @ManyToOne  
        @JoinColumn(name = "ID_UNIDADE")  
        private Unidade unidade;  

        // bi-directional many-to-one association to Empresa  
        @ManyToOne  
        @JoinColumn(name = "ID_EMPRESA")  
        private Empresa empresa;  

        // bi-directional many-to-one association to MaterialCurso  
        @OneToMany(cascade =  CascadeType.ALL , fetch = FetchType.EAGER)  
        @JoinTable(name = "MATERIAL_CURSO", joinColumns = { @JoinColumn(name = "ID_CURSO") }, inverseJoinColumns = { @JoinColumn(name = "ID_MATERIAL") })  
        private List<MaterialCurso> materialCurso;  

        public Curso() {  
        }  

    @Override  
        public String toString() {  
            return "Curso [idCurso=" + idCurso + ", abrevCurso=" + abrevCurso  
                    + ", cargaHorariaCurso=" + cargaHorariaCurso + ", nomeCurso="  
                    + nomeCurso + ", empresa=" + empresa + ", unidade=" + unidade  
                    + ", materialCurso=" + materialCurso + "]";  
        }  

    //getters and setters

Material.java

@Entity  
@Table(name = "MATERIAL")  
@NamedQueries({  
@NamedQuery(name = "Material.findAll", query = "SELECT m FROM Material m"),  
@NamedQuery(name = "Material.findByNomeMaterial", query = "SELECT u FROM Material u where u.nomeMaterial = :nomeMaterial ") })  
public class Material extends BaseEntity<MaterialDTO> {  
    private static final long serialVersionUID = 1L;  

    @Id  
    @SequenceGenerator(name = "MATERIAL_IDMATERIAL_GENERATOR", sequenceName = "SEQ_MATERIAL")  
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MATERIAL_IDMATERIAL_GENERATOR")  
    @Column(name = "ID_MATERIAL", unique = true, nullable = false)  
    private Long idMaterial;  

    @Column(name = "CODIGO_MATERIAL", length = 100)  
    private String codigoMaterial;  

    @Column(name = "NOME_MATERIAL", nullable = false, length = 200)  
    private String nomeMaterial;  

    // bi-directional many-to-one association to Unidade  
    @ManyToOne  
    @JoinColumn(name = "ID_UNIDADE")  
    private Unidade unidade;  

    // bi-directional many-to-one association to Empresa  
    @ManyToOne  
    @JoinColumn(name = "ID_EMPRESA")  
    private Empresa empresa;  

    // bi-directional many-to-one association to UnidadeMedida  
    @ManyToOne  
    @JoinColumn(name = "ID_UNIDADE_MEDIDA", nullable = false)  
    private UnidadeMedida unidadeMedida;  

    public Material() {  
    }  

@Override  
    public String toString() {  
        return "Material [idMaterial=" + idMaterial + ", codigoMaterial="  
                + codigoMaterial + ", nomeMaterial=" + nomeMaterial  
                + ", unidade=" + unidade + ", empresa=" + empresa  
                + ", unidadeMedida=" + unidadeMedida + "]";  
    }  

//getters and setters

MaterialCurso.java

@Entity  
@Table(name = "MATERIAL_CURSO")  
@NamedQueries({  
@NamedQuery(name = "MaterialCurso.findAll", query = "SELECT m FROM MaterialCurso m"),  
@NamedQuery(name = "MaterialCurso.findByIdMaterialCurso", query = "SELECT m FROM MaterialCurso m WHERE m.idMaterialCurso = :idMaterialCurso") })  
public class MaterialCurso extends BaseEntity<MaterialCursoDTO> {  
    private static final long serialVersionUID = 1L;  

    @Id  
    @SequenceGenerator(name = "MATERIAL_CURSO_IDMATERIALCURSO_GENERATOR", sequenceName = "SEQ_MATERIAL_CURSO")  
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MATERIAL_CURSO_IDMATERIALCURSO_GENERATOR")  
    @Column(name = "ID_MATERIAL_CURSO", unique = true, nullable = false)  
    private Long idMaterialCurso;  

    @Column(name = "QUANTIDADE", nullable = false)  
    private Long quantidade;  

    // bi-directional many-to-one association to Material  
    @ManyToOne  
    @JoinColumn(name = "ID_MATERIAL", nullable = false)  
    private Material material;  

    // bi-directional many-to-one association to Curso  
    @ManyToOne  
    @JoinColumn(name = "ID_CURSO", nullable = false)  
    private Curso curso;  

    public MaterialCurso() {  
    }  

@Override  
public String toString() {  
        return "MaterialCurso [idMaterialCurso=" + idMaterialCurso  
                + ", quantidade=" + quantidade + ", material=" + material  
                + ", curso=" + curso + "]";  
    }  

//getters and setters

确定。现在是将项添加到List中的方法:

CursoMB.java。

private CursoDTO cursoAuxiliar;

private MaterialCursoDTO materialCursoAuxiliar;

private List<MaterialCursoDTO> listaMaterialCursoDTO;

@PostConstruct
public void inicializar() {
    carregandoListaCursosDTO();
    cursoAuxiliar = new CursoDTO();
    materialCursoAuxiliar = new MaterialCursoDTO();
}


public String listenerAdicionaMaterialCurso() {

        if (cursoAuxiliar.getMaterialCurso() == null) {
            List<MaterialCursoDTO> listaMaterialCursoDTO = new ArrayList<MaterialCursoDTO>();
            cursoAuxiliar.setMaterialCurso(listaMaterialCursoDTO);
        }

        MaterialCursoDTO materialCurso = new MaterialCursoDTO();


        materialCurso.setMaterial(materialCursoAuxiliar.getMaterial());
        materialCurso.setQuantidade(materialCursoAuxiliar.getQuantidade());

        if (listaMaterialCursoDTO == null) {
            listaMaterialCursoDTO = new ArrayList<MaterialCursoDTO>();
        }

        listaMaterialCursoDTO.add(materialCurso);

        return "";
    }

执行调试,materialCurso和listaMaterialCursoDTO填充数据,Array也填充了位置,确定。但是,当你看到&#34; cursoAuxiliar&#34; (下面)属性&#34; List materialCurso;&#34;是空的。

public String actionSalvaCurso() {
        try {
            senatService.incluirCurso(cursoAuxiliar);

            FacesContext.getCurrentInstance().addMessage(
                    null,
                    new FacesMessage(FacesMessage.SEVERITY_INFO, "Sucesso",
                            "Curso cadastrado com sucesso"));
            carregandoListaCursosDTO();
            cursoAuxiliar = new CursoDTO();
        } catch (BusinessException e) {
            List<String> listMessage = e.getListMessage();
            Iterator<String> itListMessage = listMessage.iterator();
            while (itListMessage.hasNext()) {
                String message = itListMessage.next();
                FacesContext.getCurrentInstance().addMessage(
                        null,
                        new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                "Erro ao salvar Curso", message));
            }
        }
        return "";
    }

服务是:

public void incluirCurso(CursoDTO cursoDTO) throws BusinessException {
        if (cursoDTO == null) {
            throw new BusinessException("Não foi possível cadastrar o Curso");
        }
        if (cursoDAO.findByNomeCurso(cursoDTO.getNomeCurso()) != null) {
            throw new BusinessException("O '" + cursoDTO.getNomeCurso()
                    + "' já está cadastrado");
        }
        Curso curso = mapperConvertObjectFacade.getMapperDTOToEntity().map(
                cursoDTO, Curso.class);
        cursoDAO.create(curso);
    }

请有人帮我搞清楚吗?提前谢谢!!

0 个答案:

没有答案