これと API に関するいくつかのトピックを読みましたが、正しい方向に進んでいるように感じます。しかし、私はまだそれを機能させるのに十分な理解ができていないに違いありません。
次の 2 つのテーブルがあります: TODO と JOBTYPE
TODO テーブルには TDTDKEY (PK) と TDJTKEY(FK?) があります JOBTYPE テーブルには JTJTKEY (PK) と JTCODE があります
ご覧のとおり、Todo.tdjtkey は jobtype.jtjtkey に対応しており、私の目標はキーではなく jtcode を取得することです。
Entity クラスは部分的に次のようになります。
Todo.java
@Id
@Basic(optional = false)
@Column(name = "TDTDKEY")
private String primaryKey;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "TDJTKEY", insertable = true, updatable = true)
private JobType jobType;
public Todo() {
}
public Todo(String primaryKey) {
this.primaryKey = primaryKey;
}
public String getPrimaryKey() {
return primaryKey;
}
public void setPrimaryKey(String primaryKey) {
this.primaryKey = primaryKey;
}
public JobType getJobType() {
return jobType;
}
public void setJobType(JobType jobType) {
this.jobType = jobType;
}
JobType.java
@Id
@Basic(optional = false)
@Column(name = "JTJTKEY")
private String primaryKey;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "jobType")
private Todo todo;
@Column(name = "JTCODE")
private String jobCode;
public JobType() {
}
public JobType(String primaryKey) {
this.primaryKey = primaryKey;
}
public String getPrimaryKey() {
return primaryKey;
}
public void setPrimaryKey(String primaryKey) {
this.primaryKey = primaryKey;
}
public String getJobCode() {
return jobCode;
}
public void setJobCode(String jobCode) {
this.jobCode = jobCode;
}
そのため、名前付きクエリを実行すると、Todo.findAll
TDTDKEY (つまり TD00000001) と関連する TDJTKEY CODE (つまり PICS PGM) が返されます。
ようやく選択が機能するようになったので、追加/編集する方法を確認しようとしています。
たとえば、TD00000001 を使用していて、PROG を SUPPORT に変更したいとします。
試してみると、通常の方法でsv.setJobType(txtJobType.getText());
は機能せず、次のようになります。
method setJobType in class entity.Todo cannot be applied to given types;
required: entity.JobType
found: java.lang.String
reason: actual argument java.lang.String cannot be converted to entity.JobType by method invocation conversion
それは私には多かれ少なかれ理解できますが、Todo テーブルを更新する方法がわかりません。どういうわけか、JobType.java で SUPPORT を見つけて、その JTJTKEY を取得し、Todo.java に新しい TDJTKEY として配置する必要がありますか?
ヘルプ/ヒントをいただければ幸いです。
編集:次のコードは答えに従って機能します!ありがとう!
String jpql = "select jobType from JobType jobType where jobType.jobCode = :code";
JobType otherJobType = WWEntityManager.entityManager.createQuery(jpql, JobType.class).setParameter("code", txtJobType.getText()).getSingleResult();
todoEntity.getJobType().removeTodo(todoEntity);
todoEntity.setJobType(otherJobType);
otherJobType.addTodo(todoEntity);
そして、私のエンティティクラスは今このように見えます
Todo.java
@ManyToOne
@JoinColumn(name = "TDJTKEY", insertable = true, updatable = true)
private JobType jobType;
JobType.java
@OneToMany(targetEntity=Todo.class, mappedBy="jobType")
private Collection jobTypes;
もちろん、削除と追加のための適切なメソッドを追加する必要がありました。