3

これと 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.findAllTDTDKEY (つまり 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;

もちろん、削除と追加のための適切なメソッドを追加する必要がありました。

4

1 に答える 1

2

まず、同じジョブキーを持つ2つのTODO行があります。したがって、データが間違っているか、正しいのですが、関連付けはOneToOne/OneToOneではなくManyToOne/OneToManyである必要があります。

さて、あなたの質問について。ToDoのジョブのコードを変更したい場合、答えは非常に簡単です。

todo.getJobType().setJobCode("newCode");

実際、TODOが別の既存のJobTypeを参照するようにしたい場合(関連付けがManyToOneであると仮定):

todo.getJobType().removeTodo(todo); // remove the todo from its current job type
todo.setJobType(otherJobType); // set the new job type in todo
otherJobType.addTodo(todo); // add the todo to its new job type

ここで問題となるのは、これへの参照を取得する方法otherJobTypeです。IDをお持ちの場合、答えは簡単です。

JobType otherJobType = em.find(JobType.class, otherJobTypeId);

コードしかない場合は、クエリを実行してコードを見つける必要があります。コードが一意であると仮定すると、次のようになります。

String jpql = "select jobType from JobType jobType where jobType.jobCode = :code";
JobType otherJobType = em.createQuery(jpql, JobType.class)
                         .setParameter("code", otherJobTypeCode)
                         .getSingleResult();
于 2012-06-22T15:31:02.743 に答える