gpt4 book ai didi

java - 如何使用@OneToOne正确注释JPA实体?

转载 作者:行者123 更新时间:2023-12-01 09:26:28 25 4
gpt4 key购买 nike

同事们,我有两张 table ,选择获取CHAIN:

选择 OD_CHAINS_REQ.CHAIN
来自 OD_CHAINS_REQ
加入 od_face_accs
ON od_face_accs.ID = OD_CHAINS_REQ.ACCOUNT
其中 od_face_accs.ACNT='1608290029'
按 OD_CHAINS_REQ.NUM 排序;

OD_CHAINS_REQ 表中的记录少于 10 条,od_face_accs 表中的记录多于 1000 条。

我正在尝试通过 JPA 执行此选择。但是,据我了解,我需要创建实体 OdChainsReqEntity:

    @Entity
@Table(name = "OD_CHAINS_REQ", schema = "", catalog = "")
@IdClass(OdChainsReqEntityPK.class)
public class OdChainsReqEntity {
private Integer chain;
private Integer num;
private Integer account;

@Id
@Column(name = "CHAIN")
public Integer getChain() {
return chain;
}

public void setChain(Integer chain) {
this.chain = chain;
}

@Basic
@Column(name = "NUM")
public Integer getNum() {
return num;
}

public void setNum(Integer num) {
this.num = num;
}

@Id
@Column(name = "ACCOUNT")
public Integer getAccount() {
return account;
}

public void setAccount(Integer account) {
this.account = account;
}


@OneToOne
@JoinColumn(name = "ACCOUNT", referencedColumnName = "ID")
private OdFaceAccsEntity odFaceAccsEntity;
public OdFaceAccsEntity getOdFaceAccsEntity() {
return odFaceAccsEntity;
}

public void setOdFaceAccsEntity(OdFaceAccsEntity odFaceAccsEntity) {
this.odFaceAccsEntity = odFaceAccsEntity;
}

/*@Overrides*/*/

}

OdFaceAccsEntity实体:

@Entity
@Table(name = "OD_FACE_ACCS", schema = "", catalog = "")
public class OdFaceAccsEntity {
private Integer id;
private String acnt;



@Id
@Column(name = "ID")
public Integer getId() {
return id;
}

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



@Basic
@Column(name = "ACNT")
public String getAcnt() {
return acnt;
}

public void setAcnt(String acnt) {
this.acnt = acnt;
}

/*@Overrides*/


@OneToOne
@JoinColumn (referencedColumnName = "ACCOUNT")
private OdChainsReqEntity odChainsReqEntity;

public OdChainsReqEntity getOdChainsReqEntity() {
return odChainsReqEntity;
}

public void setOdChainsReqEntity(OdChainsReqEntity odChainsReqEntity) {
this.odChainsReqEntity = odChainsReqEntity;
}

}

所以我正在尝试使用测试来获取 Chain

 @Test
public void getChainByDepoAcc() throws Exception {

OdFaceAccsEntity odFaceAccsEntity = new OdFaceAccsEntity();
odFaceAccsEntity.setAcnt("1608290029");


List<OdFaceAccsEntity> odFaceAccsEntities = odFaceAccsDAO.getAcc(odFaceAccsEntity);

for (int i = 0; i < odFaceAccsEntities.size(); i++) {
LOG.info(odFaceAccsEntities.get(i).getId());
LOG.info(odFaceAccsEntities.get(i).getOdChainsReqEntity().getChain());
}
}

但它返回异常:

Caused by: org.hibernate.MappingException: Could not determine type for: com.alcap.app.JPA.Entities.OdFaceAccsEntity, at table: OD_CHAINS_REQ, for columns: [org.hibernate.mapping.Column(odFaceAccsEntity)]

如何正确指定实体中的关联以避免异常?

更新我尝试过的最后一个 DAO 实现:

  @Transactional(value = "txMan", readOnly = true)
public List <OdChainsReqEntity> getOdChainsReqByDEPOAcc(String in$depoAccnt) {
Query query = em.createQuery("SELECT cre FROM OdChainsReqEntity cre " +
"join OdFaceAccsEntity fae on fae.id = cre.account "+
"where fae.acnt = :depoAcc");
query.setParameter("depoAcc", in$depoAccnt);
List<OdChainsReqEntity> result = query.getResultList();
return result;
}

我也尝试了这个(但我不知道它是否适合 join select):

public List<OdChainsReqEntity> getOdChainsReqByAnyParam(OdChainsReqEntity odChainsReqEntity) {

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<OdChainsReqEntity> criteriaQuery = cb.createQuery(OdChainsReqEntity.class);
Root<OdChainsReqEntity> entityRoot = criteriaQuery.from(OdChainsReqEntity.class);

Predicate criteria = cb.conjunction();

if (odChainsReqEntity.getChain() != null) {Predicate p = cb.equal(entityRoot.get("chain"), odChainsReqEntity.getChain()); criteria = cb.and(criteria, p);}
if (odChainsReqEntity.getNum() != null) {Predicate p = cb.equal(entityRoot.get("num"), odChainsReqEntity.getNum()); criteria = cb.and(criteria, p);}
if (odChainsReqEntity.getAccount() != null) {Predicate p = cb.equal(entityRoot.get("account"), odChainsReqEntity.getAccount()); criteria = cb.and(criteria, p);}


criteriaQuery.where(criteria);
List<OdChainsReqEntity> result = em.createQuery(criteriaQuery).getResultList();

return result;

}

最佳答案

您尚未发布 DAO 实现。假设它是正确的,则问题可能是以下之一:

  1. 您定义的访问类型不一致。您将映射注释(@Column@OneToOne、...)放置在 getter 方法以及规范未定义的实体字段上。因此,将映射注释移动到字段或 getter 上,但不能同时移动到两者上:

    @Entity
    @Table(name = "OD_FACE_ACCS", schema = "", catalog = "")
    @Access(AccessType.PROPERTY)
    public class OdFaceAccsEntity {
    private Integer id;
    private String acnt;
    private OdChainsReqEntity odChainsReqEntity;

    @Id
    public Integer getId() {
    return id;
    }

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

    public String getAcnt() {
    return acnt;
    }

    public void setAcnt(String acnt) {
    this.acnt = acnt;
    }

    /*@Overrides*/

    @OneToOne(mappedBy = "odFaceAccsEntity")
    public OdChainsReqEntity getOdChainsReqEntity() {
    return odChainsReqEntity;
    }

    public void setOdChainsReqEntity(OdChainsReqEntity odChainsReqEntity) {
    this.odChainsReqEntity = odChainsReqEntity;
    }

    }



    @Entity
    @Table(name = "OD_CHAINS_REQ", schema = "", catalog = "")
    @IdClass(OdChainsReqEntityPK.class)
    @Access(AccessType.PROPERTY)
    public class OdChainsReqEntity {
    private Integer chain;
    private Integer num;
    private Integer account;
    private OdFaceAccsEntity odFaceAccsEntity;

    // the rest of the code here

    @OneToOne
    @JoinColumn(name = "ACCOUNT", referencedColumnName = "ID")
    public OdFaceAccsEntity getOdFaceAccsEntity() {
    return odFaceAccsEntity;
    }

    // the rest of the code

    }

如您所见,我在 getter 方法上移动了所有必要的映射注释(我只是删除了一些注释以节省空间,因为它们默认存在)。

  • 第二个问题是您在两个实体上放置了不正确的 @JoinColumn 注释。您必须仅将此注释放置在关系的一侧,该一侧应该是关系的所有者;在一对一关系中,将注释放置在哪一侧并不重要。关系的另一端需要映射为@OneToOne(mappedBy = "")。我刚刚将 OdFaceAccsEntity 实体设置为关系的反面并进行相应更改(请参阅上面代码中的 @OneToOne)。如果您不希望该实体成为反面,只需反转注释即可
  • 以下是 JPA 2.0 specification 的部分您可以阅读以了解如何正确映射:

    • 2.3 访问类型
    • 2.10.1 双向一对一关系

    关于java - 如何使用@OneToOne正确注释JPA实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39794667/

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