JPA eclipselink ManuToMany problem z zapisem encji

0

Witam mam taki problem otóż mam encje :

@Entity
public class ResourceType{
	
	@Id
	private Integer id; 

	@JoinColumn(name="PARENT_ID" , referenceColumnName="ID")
	@ManyToOne(fetch=FetchType.LAZY)
	private ResourceType parent;

	@JoinColumn(name="PARENT_ID" , referenceColumnName="ID")
	@OneToMany(fetch=FetchType.LAZY)
	private List<ResourceType> children = new ArrayList<>();

	@ManyToMany(mappedBy = "resourcesTypes", fetch = FetchType.EAGER)
	private Set<Resource> resources = new HashSet<>();

	..... //getter setter equals hashcode
}

Jak widać reprezentuje ona hierarchiczną struktórę .

@Entity
public class Resource {

	@Id
	@GeneratedValue(generator = "ResourceSeq", strategy = GenerationType.SEQUENCE)
	@SequenceGenerator(name = "ResourceSeq", sequenceName = "RESOURCE_SEQ", allocationSize = 1)
	@Column(name = "ID", nullable = false)

	@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	@JoinTable(name = "RESOURCE_TYPE_CROSS", joinColumns = { @JoinColumn(name = "RESOURCE_ID") }, inverseJoinColumns = {     @JoinColumn(name = "RESOURCE_TYPE_ID", referencedColumnName = "ID") })
	private List<ResourceType> resourcesTypes = new ArrayList<>();

	....//getteer setter equals hashCode
}

ResourceType pobieram w ten sposób:

public ResourceType getAllResourceTypes(){
em.createQuery("Select n from Resource n left join fetch n.children"); //endje trafiaja do kontekstu utrwalania
return em.find(ResourceType.class, 0); //0 - ROOT
}

zgodnie z : http://www.tikalk.com/java/load-tree-jpa-and-hibernate

teraz zapisanie Resource mam w ten sposób :

public void createResouce(Resource r ){

	if(r.getResourceTypes().isEmpty()){
		throw new UnsupportedOperationException("Cannot save because none resource type is set");
	}

	for(ResourceType rt : r.getResourceTypes()){
		rt.addResource(r);
	}

	em.persist(r);
}

I wszystko działa jak powinno . Problem polega na tym, że przecież Resource jest w tym przypadku stroną właścicielską relacji jednak po zapisie jak wczytuje wszystkie resouce types to nie mam tych ostatnio zapisanych Resouce ??
Nie wiem dlaczego sie tak dzieje przecież kontekst utrwalania powinien sobie chyba odświezyć te encje w cache ???

próbowałem różnych sztuczek np dać w entity manager refresch na wszystkich resource type , ale też nic to nie zmieniło :/

Dopiero po ponownym uruchomieniu serwera (Glassfish v3.0 ) wsztystko jest ok ...

0

Ale przecież to co robisz jest bez sensu.
Wyciągasz obiekt X. Do jego kolekcji obiektów Y dodajesz pewne obiekty. Następnie zapisujesz te obiekty Y (które NIJAK nie wiedzą nic na temat tego że zostały dołączone do obiektu X!) i się dziwisz że to sie nie zapisuje. MYŚL! Przecież jak zrobiłeś:

rt.addResource(r);

to 'r' NIE WIE że został powiązany z 'rt' i to że zapiszesz 'r' wcale nic w bazie ci nie zmieni, co innego gdybyś zapisal w bazie 'rt'... Powinieneś zrobić ZUPEŁNIE odwrotnie, tzn zrobić

r.addResourceType(rt);

i wtedy to co napisałeś zadziała.

1 użytkowników online, w tym zalogowanych: 0, gości: 1