我的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没有收到您的身份证明?
答案 0 :(得分:0)
由于merge
会返回修改后的值,因此无法按照文档here触及参数。
所以你需要像这样保留引用:
manager = factory.createEntityManager();
manager.getTransaction().begin();
aluno = manager.merge(aluno); //update
manager.getTransaction().commit();
manager.close();