Hi,
I'm having troubles with eclipselink JPA2 implementation.
I have this pattern:
Street
HouseNumber
PartOfStreet (M:M street:houseNumber with extra info)
@Entity
@EntityListeners(StreetValidatorListener.class)
@Table(name = "STREET")
@DiscriminatorValue(value = "STREET")
public class StreetImpl extends AreaImpl implements Street {
@OneToMany(mappedBy = "street", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
Set<PartOfStreetImpl> houseNumbers = new HashSet<>();
...
}
@Entity
@Table(name = "HOUSE_NUMBER")
@DiscriminatorValue(value = "HOUSENUMBER")
public class HouseNumberImpl extends AreaImpl implements HouseNumber {
@OneToMany( mappedBy = "houseNumber", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
private Set<PartOfStreetImpl> streets = new HashSet<>();
...
}
@Entity
@Table(name = "PART_OF_STREET", uniqueConstraints = { @UniqueConstraint(columnNames = { "STREET_ID, HOUSE_NUMBER_ID" }) })
public class PartOfStreetImpl extends AbstractEntity implements PartOfStreet {
@Id
@SequenceGenerator(name = SEQUENCE_STYX_HOUSE_NUMBER_STREET_LINK_GENERATOR, sequenceName = "SEQ_PART_OF_STREET", allocationSize = 1, initialValue = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQUENCE_STYX_HOUSE_NUMBER_STREET_LINK_GENERATOR)
private Long id;
@ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
@JoinColumn(name = "STREET_ID")
private StreetImpl street;
@ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
@JoinColumn(name = "HOUSE_NUMBER_ID")
private HouseNumberImpl houseNumber;
...
}
My problem is that when I want to create a relationship entity in between street and houseNumber, I have to persist street, houseNumber and then add partOfStreet and again persist houseNumber.
@Test
@Rollback(true)
public void testHouseNumberBelongsToAStreet() {
Street street = createAndSaveStreet();
//FIXME: If houseNumber is not saved first, it tries to persist
// partOfStreet without flushing the session so it can't find the parent id for
// housenumber
houseNumber = houseNumberFacade.saveHouseNumber(houseNumber);
PartOfStreet poStreet = houseNumberFacade.newPartOfStreet();
poStreet.setStreet(street);
poStreet.setHouseNumber(houseNumber);
street.addPartOfStreet(poStreet);
houseNumber.addPartOfStreet(poStreet);
// houseNumberFacade.savePartOfStreet(poStreet);
houseNumberFacade.saveHouseNumber(houseNumber);
Long streetPartId = street.getPartOfStreets().iterator().next().getObjectId();
Long housenumberPartId = houseNumber.getPartOfStreets().iterator().next().getObjectId();
assertEquals(streetPartId, housenumberPartId);
assertEquals(street.getPartOfStreets().iterator().next(), houseNumber.getPartOfStreets().iterator().next());
}
Please, could you give some advice of what I'm doing wrong?
Why adding the partOfStreet to houseNumber and persisting it does not cascade the changes in a right way?
Thank you guys in advance.