Hybernate Criteria API bei @ManyToOne

Soahc

Aktives Mitglied
Hallo,

ich habe 2 Entity Beans, User und Projekt. Zwischen beiden besteht eine @ManyToOne Beziehung, denn ein User kann mitglied in beliebig vielen Projekten sein und ein Projekt kann beliebig viele Mitglieder haben:

Java:
@Entity
public class Project {
	...
	@ManyToMany(cascade = CascadeType.PERSIST, fetch=FetchType.EAGER)
	@JoinTable(name="ProjectMembers", joinColumns={@JoinColumn(name="project_id")}, inverseJoinColumns={@JoinColumn(name="member_id")})
	private Set<User> userlist = new HashSet<User>();
        ....
}

nun habe ich auch eine Manager Bean, die sich um verschiedene Aufgaben kümmert. Unter anderem auch eine Methode, die alle Projekte zurück gibt:

Java:
        @Override
	@RolesAllowed({"ADMIN","USER","PROJECTCREATOR"})
	public List<Project> getAllProjects() {
		DetachedCriteria criteria = DetachedCriteria.forClass(Project.class);
		final List projectlist = getEntityDAO().findEntitys(criteria); 
		return (List<Project>) projectlist;
	}

Das funktioniert auch ohne Probleme soweit. Nun möchte ich aber, dass wenn die Rolle des Aufrufenden USER ist, dass dann nur die Projekte zurück gegeben werden, in denen er auch wirklich mitglied ist. (getCurrentUser() gibt das Userobjekt zum Aufrufenden User zurück)

Java:
        @Override
	@RolesAllowed({"ADMIN","USER","PROJECTCREATOR"})
	public List<Project> getAllProjects() {
		DetachedCriteria criteria = DetachedCriteria.forClass(Project.class);
		if (context.isCallerInRole("USER")){
			criteria = criteria.createAlias("userlist", "user").add(Restrictions.eq("user", getCurrentUser()));
		}
		final List projectlist = getEntityDAO().findEntitys(criteria); 
		return (List<Project>) projectlist;
	}

Das funktioniert so aber nicht. Mein JPA Buch bringt mich nicht mehr weiter und bei google habe ich bisher auch nichts gefunden. Hat jemand einen Tip, wie man das lösen könnte?

liebe Grüße, Soahc
 

pizza1234

Mitglied
Hi,
bei einer ManyToMany-Beziehung hast du doch auch eine Liste der zugehörigen Projekte in jedem User!
Deshalb müßtest du eigentlich über
Java:
 getCurrentUser().getProjectList()
an die Projekte kommen...

Grüße
Peter
 

Soahc

Aktives Mitglied
mh.. da hast Du natürlich recht und ich muss mich gleich entschuldigen! Ich habe das Ganze ein bisschen vereinfacht darstellen wollen. Tatsächlich sieht es so aus: Es gibt eine Klasse Subproject, die mit einer ManyToOne-Beziehung auf eine "Ober"-SubProjekt verweist. Ein solches SubProjekt kann also n SubProjekte unter sich haben, was im ganzen eine Baumstruktur aufspannt. Von der Klasse SubProjekt erbt die Klasse RootProjekt, sie hat noch zusätzliche Eigenschaften und ihr "Ober"-SubProjekt ist immer null. Sie stellt praktisch die Wurzel eines solchen SubProjekt-Baumes dar. Die Anfangs genannte ManyToMany-Beziehung gehört zur Klasse SubProjekt... so können also sowohl RootProjekte, als auch SubProjekte Member haben.
Die genannte Methode getAllProjects soll aber nur RootProjekte, also die Wurzeln liefern... weshalb ich an dieser Stelle nicht die Methode getCurrentUser().getProjectList() des aktuellen Users nutzen kann, da sie ja auch unterprojekte enthält.

Gut ich könnte, die .getProjectList()-Liste noch einmal durchgehen und nur die echten RootProjekte zurück geben. Aber wäre das Sinnvoll?
Und auch generell, es muss doch möglich sein mit der Criteria API auf manytomany-Beziehungen sich beziehen zu können, oder?

grüße,
Soahc
 
Zuletzt bearbeitet:

pizza1234

Mitglied
??,verstehe ich nicht!
Sub- und Oberprojekte hören sich für mich nach Vererbung an und die realisiert man zumindestens in Hibernate nicht über ManyToOne-Beziehungen. Abgesehen davon würde ich die Criteria-API nur für wirklich komplizierte Dinge verwenden
und nicht für Objektbeziehungen untereinander. Das Ganze heißt ja OR-Mapping, damit du deine Objekte/-beziehungen auf deine DB abbilden kannst und nicht wieder durch Criteria/SQL/HQL o.ä. alles selber machen musst. Wie sieht den dein ER-Model aus? Für mich hört sich das ein wenig nach einem Designfehler an.

Grüße
Peter
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Hibernate Criteria API length() Data Tier 6
S JPA 2 Criteria Data Tier 3
R JPA Criteria API: gefilterte Listen mit fetch laden Data Tier 5
D Hibernate-Criteria-API (Projections und MAX-Funktion) Data Tier 6
R Hibernate Criteria Abfrageproblem Data Tier 2
A JPA Criteria, BETWEEN, Data Tier 8
R Hibernate Criteria OR Data Tier 2
R Hibernate Criteria .group größer als Data Tier 5
LadyMilka (Hibernate) in Criteria implizierter Join durch Subquery's Data Tier 8
M JPA 2.0: Query mit der Criteria API: Wie case-insensitive machen? Data Tier 1
byte Hibernate: Criteria & SubQuery - Unknown Entity null Data Tier 1
GilbertGrape Criteria:Warum doppelte Ergebnisse? Data Tier 4
O Hibernate: Suche über Criteria Data Tier 7
byte Hibernate: Criteria vom Interface erzeugen Data Tier 3
Avalon @ManyToOne Hibernate oder JPA? Data Tier 5
M @ManyToOne ConstraintViolationException Data Tier 5
C JPA oneToMany/ManyToOne bidirektional verwirrung Data Tier 6
G Hibernate OneToMany und ManyToOne Objekte löschen Data Tier 13
T UniqueConstrained & ManyToOne ?! Data Tier 1
M EJBQL: Item aus einer Collection(ManyToOne) löschen Data Tier 7
M ManyToOne Verknüpfung Data Tier 4
G hibernate und ManyToOne Data Tier 11
K hibernate manytoone beziehung und fremdschlüssel als primary schlüssel Data Tier 2
alexpetri hibernate ManyToOne auch einfacher? Data Tier 9
B Hibernate: unidirekt., ManyToOne und OneToOne, compositeId.. Data Tier 3

Ähnliche Java Themen

Neue Themen


Oben