父实体合并后,实体的子节点不会收到id

时间:2014-05-24 21:36:50

标签: jpa

我的WEB应用程序中存在CascateType.ALL的问题。更新我的实体Aluno后,我的子实体NivelAlunoLinguaEstrangeira无法按预期工作

@Entity
@Table(name = "ed44_aluno")
@SequenceGenerator(name = "ED44_SQC", sequenceName = "ed44_aluno_ed44_cod_aluno_seq", initialValue = 0, allocationSize = 1)
public class Aluno implements AbstractEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ED44_SQC")
    @Column(name = "ed44_cod_aluno")
    private Long id;

    @OneToMany(mappedBy = "aluno", cascade = { CascadeType.ALL })
    private List<NivelAlunoLinguaEstrangeira> linguas;

}

@Entity
@Table(name = "ed77_linguagem_aluno")
@SequenceGenerator(name = "ED77_SQC", sequenceName = "s_ed77_linguagem_aluno", initialValue = 0, allocationSize = 1)
public class NivelAlunoLinguaEstrangeira implements AbstractEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ED77_SQC")
    @Column(name = "ed77_cod_linguagem")
    private Long id;

    @OneToOne
    @JoinColumn(name = "fked77ed44_cod_aluno")
    private Aluno aluno;

}

    public static void main(String[] args) {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("post");      
        EntityManager manager = factory.createEntityManager();
        Aluno aluno = manager.find(Aluno.class, 1l);
        aluno.getLinguas().size();
        manager.close();

        NivelAlunoLinguaEstrangeira nivel = new NivelAlunoLinguaEstrangeira();
        nivel.setAluno(aluno);
        aluno.addLingua(nivel);

        manager = factory.createEntityManager();
        manager.getTransaction().begin();
        manager.merge(aluno); //update
        manager.getTransaction().commit();
        manager.close();

        System.out.println(nivel); // nivel.getId() == null WHY?
    }

我的输出:

找到方法调用后

  

选择aluno,其中id = 1(已编辑,长查询)

合并方法调用后:

  

选择nextval('s_ed77_linguagem_aluno')

提交后

  

插入ed77_linguagem_aluno(fked77ed44_cod_aluno,fked77tg22_cod_nivel_lingua_ent,fked77tg22_cod_nivel_lingua_esc,fked77tg22_cod_nivel_lingua_fal,fked77tg22_cod_nivel_lingua_le,fked77tg33_cod_lingua,ed77_cod_linguagem)的值(?,?,?,?,?,?,?)

代码结束:

  

NivelAlunoLinguaEstrangeira [id = null,aluno = Aluno [id = 1,codigoInep = null,codigoNis = null,nome = FULANO DE TAL EDITADO 8,apelido = null,nascimento = null,nDependentes = null,mae = null,pai = null,conjuge = null,fotoSrc = null,dataCadastro = 2014-05-23 15:46:43.586,endereco = null,contato = null,documentacao = null],lingua = null,escreve = null,entende = null,fala = null,leitura = null]

问题是:为什么我的实体NivelAlunoLinguaEstrangeira没有收到您的身份证明?

1 个答案:

答案 0 :(得分:0)

由于merge会返回修改后的值,因此无法按照文档here触及参数。

所以你需要像这样保留引用:

manager = factory.createEntityManager();
manager.getTransaction().begin();
aluno = manager.merge(aluno); //update
manager.getTransaction().commit();
manager.close();