![](/img/trans.png)
[英]JPA: How do I avoid loading an object simply so I can store its ID in the database?
[英]How can I find an object in JPA by its Composited Key ID
我试图从我的数据库表 Real_States 中找到一个 object,如下所示:
CREATE TABLE REAL_STATES (
address VARCHAR(30) NOT NULL,
admin_id VARCHAR(15) NOT NULL,
resident_id VARCHAR(15),
real_state_type_id INT(6) NOT NULL,
block VARCHAR(3) NOT NULL,
internal_id INT(5) NOT NULL,
PRIMARY KEY (address, block, internal_id),
FOREIGN KEY (real_state_type_id) REFERENCES REAL_STATE_TYPES (real_state_type_id),
FOREIGN KEY (admin_id) REFERENCES ADMINS (admin_id),
FOREIGN KEY (resident_id) REFERENCES RESIDENTS (resident_id)
);
我想通过它的复合主键(地址、块、internal_id)获取该表的一行,所有这些都来自我的 EntityManager。 这是这样的:
public RealState findRealState(RealStateID realStateId) {
RealState realState = em.find(RealState.class, realStateId); // first Try, which failed
List<RealState> realStates = em.createQuery("FROM RealState rs WHERE rs.realStateID.address like :" + realStateId.getAddress()).getResultList(); // second try which failed too
for (RealState realState2 : realStates) {
System.out.println(realState2.toString());
}
if (realState == null) {
throw new EntityNotFoundException("Can't find realState for ID " + realStateId.toString());
}
return realState;
}
RealStateID Class 声明如下:
@Embeddable
public class RealStateID implements Serializable{
private static final long serialVersionUID = 6485406412363395170L;
@Column(name = "address")
private String address;
@Column(name = "block")
private String block;
@Column(name = "internal_id")
private int internal_id;
//getters..setters..
但是我只是错误地出错,IDK我做错了什么,我想弄清楚。 我没有使用 Spring,只是 JPA Hibernate 和 ZD52387880E1EA22817A72D375Z23。
正如文档中所述:
主键 class 必须定义
equals
和hashCode
方法,与主键映射到的基础数据库类型的相等性一致。
假设它,方法:
RealState realState = em.find(RealState.class, new RealStateID(...));
应该按预期工作。
编辑您的RealStateID
应如下所示:
@Embeddable
public class RealStateID implements Serializable{
private static final long serialVersionUID = 6485406412363395170L;
@Column(name = "address")
private String address;
@Column(name = "block")
private String block;
@Column(name = "internal_id")
private int internal_id;`
// getters, setters
@Override
public boolean equals(Object o) {
if ( this == o ) return true;
if ( o == null || getClass() != o.getClass() ) return false;
RealStateID pk = (RealStateID) o;
return Objects.equals(address, pk.address) &&
Objects.equals(block, pk.block) &&
Objects.equals(internal_id, pk.internal_id);
}
@Override
public int hashCode() {
return Objects.hash(address, block, internal_id);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.