【问题标题】:Java Entity Class: How to add/edit items in an entity with joined columns?Java 实体类:如何在具有连接列的实体中添加/编辑项目?
【发布时间】:2012-06-22 13:33:45
【问题描述】:

我已经阅读了几个关于这个以及 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;

当然,我必须添加适当的删除和添加方法。

【问题讨论】:

    标签: java entity jointable


    【解决方案1】:

    首先,您有 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
    

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

    【讨论】:

    • 你在各方面都是对的!我更改了与 ManyToOne/OneToMany 的关系,并将集合与删除/添加方法一起使用。现在一切正常(直到我再次打破它)!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-01-26
    • 2014-01-02
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2021-05-03
    相关资源
    最近更新 更多