I Have a relationship OneToMany:1工作有N个步骤我想更新工作的列表步骤。
添加新元素是有效的,但当我想更新或删除元素时,它似乎不起作用
- update:不更新正确的元素
- delete:不删除关系(对于已删除的元素)
这里是我的实体:(我没有定义equals和hascode方法)
工作:
@Entity
@Table(name = "T_STEP")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorOptions(force = true)
@DiscriminatorColumn(name = "BL_DELETE", discriminatorType = DiscriminatorType.INTEGER)
public class WorkEntity implements Serializable {
@OneToMany(mappedBy = "STEP", cascade = CascadeType.ALL)
// @OneToMany(cascade = CascadeType.ALL)
// @JoinColumn(name = "ID_TRA")
private Set < StepEntityEntity > etapes = new HashSet <>();
步骤:
@Entity
@Table(name = "T_STEP")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorOptions(force = true)
@DiscriminatorColumn(name = "BL_DELETE", discriminatorType = DiscriminatorType.INTEGER)
public class StepEntity implements Serializable {
@ManyToOne
@JoinColumn(name = "ID_WORK", updatable = true, insertable = true)
private WorkEntity work;
在我的数据库中,我有:
工作-[ID:01-ID_Work:01-LABEL:stepOne]
步骤:-[ID:01-ID_WORK:01-标签:第一步]-[ID:02-ID_WORK:02-标签:第二步]
测试:获取实体并将元素添加到步骤集合中。当我这样做时:
// GET ENTITY
WorkEntity workOne = getEntityManager().find(WorkEntity.clazz, 01);
StepEntity stepThree = new StepEntity("stepThree");
StepEntity stepFour = new StepEntity("stepFour");
stepThree.setWork(workOne);
stepFour.setWork(workOne);
Set <StepEntity> newList = workEntity.getSteps();
newList.add(stepThree);
newList.add(stepFour);
workEntity.getSteps().clear();
workEntity.getSteps().setSteps(newList);
这就是工作:步骤:
- [ID:01-ID_WORK:01-标签:步骤一]
- [ID:02-ID_WORK:02-标签:第二步]
- [ID:03-ID_WORK:03-LABEL:stepThree]//元素添加OK
- [ID:04-ID_WORK:04-LABEL:stepTwo]//元素添加OK
#TEST 02:添加+更新
// GET ENTITY
WorkEntity workOne = getEntityManager().find(WorkEntity.clazz, 01);
StepEntity stepThree = new StepEntity("stepThree");
StepEntity stepFour = new StepEntity("stepFour");
stepThree.setWork(workOne);
Set <StepEntity> newList = new HashSet(workEntity.getSteps());
List <StepEntity> aa = new ArrayList<StepEntity>(workEntity.getSteps()); // to do an easy get
Step keepStepTwo = aa.get(1);
keepStepTwo.setLabel("I changed !");
newList.add(keepStepTwo);
newList.add(stepThree);
newList.add(stepFour);
//init and set
workEntity.getSteps().clear();
workEntity.getSteps().setSteps(newList);
我有:步骤:
- [ID:01-ID_WORK:01-LABEL:我更改了!]//改为删除
- [ID:02-ID_WORK:02-LABEL:stepTwo]//待更改的整数
- [ID:03-ID_WORK:03-标签:步骤三]
- [ID:04-ID_WORK:04-标签:第二步]
我预计:
已删除关系谢谢,
您似乎并没有真正理解Java使用引用。您不需要从实体中获取步骤的集合、构造副本、向副本中添加元素以及将实体的集合设置为此副本。您所需要做的就是向实体的步骤集合中添加一个元素:
entity.getStep(s).add(...);
您还假设实体将始终以相同的顺序在集合中(步骤1,然后是步骤2)。事实并非如此。首先,因为集合没有任何顺序。第二个原因是,即使使用List,如果不对列表进行排序,或者不使用OrderColumn对其进行排序,那么列表实际上就是一个包,其中元素的顺序是任意的。
话虽如此。主要的问题是,再一次,你只修改了关联的反面,而没有修改所有者。所有者方为Step.work
。这就是您需要修改以设置/删除关联的内容。因此,添加一个新步骤:
Step step = new Step();
step.setWork(work); // mandatory
em.persist(step);
work.getSteps().add(step); // optional, but needed to keep the coherence of the object graph
更新步骤标签:
Set<Step> steps = work.getSteps();
Step step1 = findStepHavingLabel(steps, "stepOne");
step1.setLabel("changed");
断开一个步骤的工作:
Set<Step> steps = work.getSteps();
Step step1 = findStepHavingLabel(steps, "stepOne");
step1.setWork(null); // mandatory
steps.remove(step1); // optional, but needed to keep the coherence of the object graph