Java实体类:如何在具有连接列的实体中添加/编辑项?

Java实体类:如何在具有连接列的实体中添加/编辑项?,java,entity,jointable,Java,Entity,Jointable,我已经阅读了一些关于这个以及API的主题,我觉得我走在了正确的轨道上;然而,我必须仍然没有足够的理解来让它工作,因为。。嗯,它不起作用 我有以下两个表:TODO和JOBTYPE TODO表有TDKEY(PK)和TDJTKEY(FK?) 作业类型表有JTKEY(PK)和JTCODE 如您所见,Todo.tdjtkey对应于jobtype.jtkey,我的目标是检索jtcode而不是键 实体类部分如下所示: Todo.java @Id @Basic(optional = false) @Colum

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

我有以下两个表:TODO和JOBTYPE

TODO表有TDKEY(PK)和TDJTKEY(FK?) 作业类型表有JTKEY(PK)和JTCODE

如您所见,Todo.tdjtkey对应于jobtype.jtkey,我的目标是检索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;
}
@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;
}
JobType.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;
}
@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
进行命名查询时,它会给我tdkey(即TD00000001)和相关的TDJTKEY代码(即PICS PGM)

现在,现在我终于让我的select工作了,我正在尝试看看如何添加/编辑

例如,如果我在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中找到支持,然后获取它的jtKey,并将它作为新的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;

当然,我必须为remove和add添加适当的方法。

首先,您有两个具有相同作业密钥的待办事项行。所以,要么数据是错误的,要么数据是正确的,但是你的关联应该是manytone/OneToMany而不是OneToOne/OneToOne

现在,关于你的问题。如果要更改todo作业的代码,答案非常简单:

todo.getJobType().setJobCode("newCode");
事实上,如果您希望TODO引用另一个现有作业类型(假设关联为多工单):

现在的问题是:如何获取对此
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();

你在各方面都是对的!我将关系更改为manytone/OneToMany,并将collection与remove/add方法一起使用。现在一切正常(直到我再次打破它)!非常感谢。