gpt4 book ai didi

java - JPA 实体和 JAXB 条件序列化

转载 作者:行者123 更新时间:2023-11-30 10:44:49 26 4
gpt4 key购买 nike

我正在使用 JAX-RS、JPA 和 JAXB 开发 Web 服务。

我在使用 JAXB 注释序列化 JPA 实体时遇到问题。

这是模型:

项目.java

@XmlRootElement
@Entity(name = "projetos")
@XmlAccessorType(XmlAccessType.FIELD)
public class Projeto implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "idProjeto")
private Long id;

private String nome;

@OneToMany(mappedBy = "projeto", cascade = {CascadeType.PERSIST})
@XmlElementWrapper(name = "targets")
@XmlElement(name = "target")
private Collection<Target> targets = new ArrayList<Target>();


public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getNome() {
return nome;
}

public void setNome(String nome) {
this.nome = nome;
}

public Collection<Target> getTargets() {
return targets;
}

public void setTargets(Collection<Target> targets) {
this.targets = targets;
}
}

目标.java

@Entity(name = "targets")
@XmlAccessorType(XmlAccessType.FIELD)
public class Target {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="idTarget")
private Long id;

private String nome;

@ManyToOne
@XmlTransient
private Projeto projeto;

@Column(name = "tipo")
@Enumerated(EnumType.STRING)
private TipoTarget tipoTarget;

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getNome() {
return nome;
}

public void setNome(String nome) {
this.nome = nome;
}

public TipoTarget getTipoTarget() {
return tipoTarget;
}

public void setTipoTarget(TipoTarget tipoTarget) {
this.tipoTarget = tipoTarget;
}

public Projeto getProjeto() {
return projeto;
}

public void setProjeto(Projeto projeto) {
this.projeto = projeto;
}

场景:我想列出所有项目并检索给定 ID 的项目。

在检索给定 ID 的项目时,没有问题。

问题是在列出所有项目时出现的。在这种情况下,我不希望 XML 显示目标,因为此时我不打算使用该信息。在这种情况下,运行此查询的 JPQL 不会获取目标。当 JAXB 尝试将“Projetos”列表序列化为 XML 时,它会抛出 LazyInitializationException。

因此,问题来了:我如何注释我的类,以便它在未填充字段时忽略该字段而不是尝试获取它?

编辑 1

不确定我之前是否很清楚,所以我会更好地解释它。

当我搜索给定 ID 的项目时,我在 JPQL 查询中获取目标并且 JAXB 成功序列化。

当列出所有项目时,我不会获取所有目标而且我也不想这样做,因为我不会在调用此方法时使用此信息。此刻,我收到了 LazyInitializationException。

最佳答案

我是这样解决这个问题的:

  • 通过替换字段中的 JPA 注释并将它们放在 getter 方法上,JPA 不使用其代理中的字段。因此,JAXB 编码(marshal)处理不会触发延迟加载的属性。
  • 列出所有项目不会获取目标,所以没关系,但是要在按 ID 查询项目时获取目标,请使用以下代码片段:


    Query q = this.em.createQuery("SELECT p FROM Projeto p JOIN FETCH p.targets WHERE p.id = :id");
    q.setParameter("id", projectId);
    Projeto project = (Projeto) q.getSingleResult();

  • 关于java - JPA 实体和 JAXB 条件序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37309161/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com