Java 尝试使用JPA合成键查找对象时出错
我一直在尝试从BD表中获取一个对象,如下所示:Java 尝试使用JPA合成键查找对象时出错,java,hibernate,jpa,find,composite-key,Java,Hibernate,Jpa,Find,Composite Key,我一直在尝试从BD表中获取一个对象,如下所示: 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,
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)
);
@Entity
@Table(name = "real_states")
public class RealState implements Serializable{
private static final long serialVersionUID = 4033627448194380926L;
@EmbeddedId
private RealStateID realStateID;
@Column(name = "real_state_type_id")
@Enumerated(EnumType.ORDINAL)
private RealStateType realStateType;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "admin_id", insertable = true)
private Admin admin;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "resident_id", referencedColumnName = "resident_id", nullable = false)
private Resident resident;
//getters & setters..
使用复合主键(地址、块、内部id)
我正试图使用EntityManager.find(…)在BD中找到我的一个对象,并使用下一列值:addres=A304,block=A1,internal_id=302
但我每次都会遇到这样的错误:
780 ERROR [io.undertow.request] (default task-1) UT005023: Exception handling request to /ProyectoSw/FindRealStateServlet: javax.persistence.EntityNotFoundException: Can't find realState forRealStateID [address=A302, block=A1, internal_id=302]
at deployment.ProyectoSw.war//edu.uptc.model.Manager.findRealState(Manager.java:57)
我的合成密钥类是:
包edu.uptc.entity
导入java.io.Serializable;
导入java.util.Objects
导入javax.persistence.Column;
导入javax.persistence.embeddeble
@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;
public RealStateID(String address, String block, int internal_id) {
super();
this.address = address;
this.block = block;
this.internal_id = internal_id;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getBlock() {
return block;
}
public void setBlock(String block) {
this.block = block;
}
public int getInternal_id() {
return internal_id;
}
public void setInternal_id(int internal_id) {
this.internal_id = internal_id;
}
@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);
}
@Override
public String toString() {
return "RealStateID [address=" + address + ", block=" + block + ", internal_id=" + internal_id + "]";
}
}
以及我试图获取的对象所属的父类。RealState是这样的:
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)
);
@Entity
@Table(name = "real_states")
public class RealState implements Serializable{
private static final long serialVersionUID = 4033627448194380926L;
@EmbeddedId
private RealStateID realStateID;
@Column(name = "real_state_type_id")
@Enumerated(EnumType.ORDINAL)
private RealStateType realStateType;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "admin_id", insertable = true)
private Admin admin;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "resident_id", referencedColumnName = "resident_id", nullable = false)
private Resident resident;
//getters & setters..
最后是找到该对象的EntityManager方法:
public RealState findRealState(RealStateID realStateID) {
RealState realState = em.find(RealState.class, new RealStateID("A302", "A1", 302));
if (realState == null) {
throw new EntityNotFoundException("Can't find realState for" + realStateID.toString());
}
return realState;
}
包含RealStateID(地址、块、内部_id)值的行已经在我的BD中,但出于某种原因,应用程序一直给我这个错误。我仍然不明白为什么您确定表中的varchar列不包含前导空格或尾随空格吗?您使用什么事务隔离级别,即这些行对尝试查找对象的事务实际可见吗?