我有一个关系OneToMany:1工作有N个步骤 我想更新工作的列表步骤。OneToMany - 修改集合[删除/更新] - 双向
添加新元素的作品,但是当我想更新或删除它似乎不是。
- 更新:不更新正确的元素
- 删除:不删除的关系(对于已删除的元素)
这里我的实体:(我还没有定义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]
感谢,
Thanksyou您的及时答复。好吧,这是我的想法,但我希望冬眠可以单独做到这一点。 (删除关系) – user3073466
也许它会工作如果我定义了equals和hashcode函数? (我会帮助冬眠找到合适的实体) http://docs.jboss.org/hibernate/core/4.0/manual/en-US/html/persistent-classes.html#persistent-classes-equalshashcode – user3073466
做清单.get(1)将获得索引为1的元素,无论该元素的类是否覆盖'equals()'。 –