OneToMany-修改集合[删除/更新]-双向



I Have a relationship OneToMany:1工作有N个步骤我想更新工作的列表步骤。

添加新元素是有效的,但当我想更新或删除元素时,它似乎不起作用

  1. update:不更新正确的元素
  2. 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-标签:第二步]

我预计:

已删除关系
  • [ID:02-ID_WORK:02-LABEL:我更改了!]//实体已更新
  • [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
    

    最新更新