我有覆盖具有id的Oracle数据库表的实体。这很有效。
但是,还有另一个表基本上由外键EvId
和其他列组成。没有列设置为NOT NULL
,只有外键具有所有行的值:
CREATE TABLE PERSON (
EVID NUMBER,
ROLE VARCHAR2(128 BYTE),
JOBID NUMBER,
NAME VARCHAR2(128 BYTE))
如果我正确理解JPA,它总是需要一个id才能让事情顺利进行。此外,它要求所有id字段不能为空。像here或here这样的信息对我没有帮助。
Spring的存储库接口如下所示:
public interface PersonDao extends Repository<Person, Long> {
public List<Person> findByEvidOrderByNameAsc(Long id);
}
现在,日志输出如下所示:
2016-05-24 11:17:32,107 DEBUG [org.hibernate.SQL] [main] select person0_.evid as evid1_2_, person0_.Name as Name3_2_, person0_.Role as Role5_2_, person0_.jobid as jobid6_2_ from Person person0_ where person0_.evid=? order by person0_.Name asc
2016-05-24 11:17:32,107 TRACE [org.hibernate.type.descriptor.sql.BasicBinder] [main] binding parameter [1] as [BIGINT] - [20507092]
2016-05-24 11:17:32,108 DEBUG [org.hibernate.loader.Loader] [main] Result set row: 0
2016-05-24 11:17:32,109 DEBUG [org.hibernate.loader.Loader] [main] Result row: null
2016-05-24 11:17:32,109 DEBUG [org.hibernate.loader.Loader] [main] Result set row: 1
2016-05-24 11:17:32,109 DEBUG [org.hibernate.loader.Loader] [main] Result row: null
Person
的bean类必须是什么样的?
编辑:根据请求,这里是bean类(我不想添加它,因为它在所有测试后都是完全混乱)
@Entity
//@IdClass(Person.Key.class)
public class Person {
// @Embeddable
// public static class Key implements Serializable {
//
// private static final long serialVersionUID = 1L;
//
// public Key(Long evid, String role, Integer jobId, String name) {
// this.evid = evid;
// this.role = role;
// this.jobId = jobId;
// this.name = name;
// }
//
// @Column(name = "evid", nullable = true, insertable = false, updatable = false)
// private Long evid;
//
// @Column(name = "role", nullable = true, insertable = false, updatable = false)
// private String role;
//
// @Column(name = "jobid", nullable = true, insertable = false, updatable = false)
// private Integer jobId;
//
// @Column(name = "name", nullable = true, insertable = false, updatable = false)
// private String name;
//
// @Override
// public int hashCode() {
// return Objects.hash(evid, role, jobId, name);
// }
//
// @Override
// public boolean equals(Object obj) {
// return Objects.deepEquals(obj, this);
// }
//
// }
//
// @EmbeddedId
// private Key key;
// @Id
@Column(name = "evid", nullable = true)
private Long evid;
// @Id
@Column(name = "role", nullable = true)
private String role;
// @Id
@Column(name = "jobid", nullable = true)
private Integer jobId;
// @Id
@Column(name = "name", nullable = true)
private String name;
@Id
@Column(insertable = false, updatable = false)
public String getRowId() {
return "" + RandomUtils.nextInt(0, Integer.MAX_VALUE);
}
public void setRowId(String rowId) {
System.out.println("rowid: " + rowId);
}
public Long getEvid() {
return this.evid;
}
public void setEvid(Long evid) {
this.evid = evid;
}
public String getRole() {
return this.role;
}
public void setRole(String role) {
this.role = role;
}
public Integer getJobId() {
return this.jobId;
}
public void setJobId(Integer jobId) {
this.jobId = jobId;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
return RandomUtils.nextInt(0, Integer.MAX_VALUE);
}
// @Override
// public int hashCode() {
// return Objects.hash(evid, role, jobId, name);
// }
@Override
public boolean equals(Object obj) {
return Objects.deepEquals(obj, this);
}
@Override
public String toString() {
return evid + ": " + name + " (" + Job.getById(jobId).getName() + "): " + role;
}
}