3

我已经阅读了几个关于这个以及 API 的主题,我觉得我在正确的轨道上;但是,我必须仍然没有足够的理解来让它工作,因为..它不起作用!

我有以下 2 个表:TODO 和 JOBTYPE

TODO 表有 TDTDKEY (PK) 和 TDJTKEY(FK?) JOBTYPE 表有 JTJTKEY (PK) 和 JTCODE

在此处输入图像描述

如您所见,Todo.tdjtkey 对应于 jobtype.jtjtkey,我的目标是检索 jtcode 而不是密钥。

实体类部分看起来像这样:

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 并将其作为新的 TDJTKEY 放在 Todo.java 中?

任何帮助/提示表示赞赏!

编辑:以下代码按答案工作!谢谢!

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 行具有相同的作业键。因此,数据要么错误,要么正确,但您的关联应该是 ManyToOne/OneToMany 而不是 OneToOne/OneToOne。

现在,关于你的问题。如果你想改变一个待办事项的代码,答案很简单:

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

现在的问题是:如何获得对 this 的引用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 回答