2014-02-28 36 views
0

我有一个关系OneToMany:1工作有N个步骤 我想更新工作的列表步骤。OneToMany - 修改集合[删除/更新] - 双向

添加新元素的作品,但是当我想更新或删除它似乎不是。

  1. 更新:不更新正确的元素
  2. 删除:不删除的关系(对于已删除的元素)

这里我的实体:(我还没有定义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 - LABEL:stepOne] - [ID:02 - ID_WORK:02 - LABEL:step两个]

测试:获取实体并将元素添加到步骤集合。 当我做:

// 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 - LABEL:的StepOne]
  • [ID:02 - ID_WORK:02 - LABEL :stepTwo]
  • [ID:03 - ID_WORK:03 - LABEL:stepThree] //元素添加行
  • [ID:04 - ID_WORK:04 - LABEL:stepTwo] //元素添加行

#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] // intead to be changed ...
  • [ID:03 - ID_WORK:03 - LABEL:stepThree]
  • [ID:04 - ID_WORK:04 - LABEL:stepTwo]

我已预料到:

  • [ID:01 - ID_WORK:NULL - LABEL:stepOne] //删除关系。
  • [ID:02 - ID_WORK:02 - LABEL:我改变] //实体更新
  • [ID:03 - ID_WORK:03 - LABEL:stepThree]
  • [ID:04 - ID_WORK:04 - 标签:stepTwo]

感谢,

回答

0

看来你没有真正的理解是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 
+0

Thanksyou您的及时答复。好吧,这是我的想法,但我希望冬眠可以单独做到这一点。 (删除关系) – user3073466

+0

也许它会工作如果我定义了equals和hashcode函数? (我会帮助冬眠找到合适的实体) http://docs.jboss.org/hibernate/core/4.0/manual/en-US/html/persistent-classes.html#persistent-classes-equalshashcode – user3073466

+0

做清单.get(1)将获得索引为1的元素,无论该元素的类是否覆盖'equals()'。 –