JPA

nex_m

Erfahrenes Mitglied
Hi,

ich hoffe ihr könnt mir bei meinem Problem etwas auf die Sprünge helfen :)

Ich versuche gerade Dokumente zu persistieren. Wobei ein Dokument (doc_id, name) von mehreren Benutzern (user_id, name) gelesen werden kann. Dazu soll noch der Status des Lesens eines Benutzers gesetzt werden können, also z.B am lesen oder gelesen. Bsp. Doc1 -> User1 -> GELESEN, Doc1 -> User2 -> AM_LESEN

Meine bisherige Lösung sieht wie folgt aus:

Code:
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "Documents")
public class Document{

	@Id
	@GeneratedValue
	private int id;

	private String name;


	public int getID(){
		return id;
	}


	public void setID(int id){
		this.id = id;
	}


	public void setName(String name){
		this.name = name;
	}


	public String getName(){
		return name;
	}
}

Code:
import java.io.Serializable;

import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import static javax.persistence.EnumType.STRING;
import javax.persistence.Table;

@Entity
@Table(name = "DocStates")
public class DocState implements Serializable{

	public enum State{
		PUBLISHED, UNREAD
	}

	@EmbeddedId
	private DocStatePK pk;

	@Enumerated(STRING)
	private State state;


	public DocState(){

	}


	public DocState(DocStatePK pk, State state){
		this.setPk(pk);
		this.setState(state);
	}


	public void setPk(DocStatePK pk){
		this.pk = pk;
	}


	public DocStatePK getPk(){
		return pk;
	}


	public void setState(State state){
		this.state = state;
	}


	public State getState(){
		return state;
	}
}

Code:
import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.Table;

@Entity
@Table(name = "Users")
public class User implements Serializable{

	@Id
	@GeneratedValue
	private int id;

	private String name;

	public User(){
		
	}

	public void setID(int id){
		this.id = id;
	}


	public int getID(){
		return id;
	}


	public void setName(String name){
		this.name = name;
	}
}

Code:
import java.io.Serializable;

import javax.persistence.Embeddable;

@Embeddable
public class DocStatePK implements Serializable{

	private int doc_id;

	private int user_id;


	public DocStatePK(){

	}


	public DocStatePK(int doc_id, int user_id){
		this.setDoc_id(doc_id);
		this.setUser_id(user_id);
	}


	public void setDoc_id(int doc_id){
		this.doc_id = doc_id;
	}


	public int getDoc_id(){
		return doc_id;
	}


	public void setUser_id(int user_id){
		this.user_id = user_id;
	}


	public int getUser_id(){
		return user_id;
	}
}

Wie würdet ihr das Problem modelieren. Würde man diese Entität DocState expliziet einführen oder kann man das auch über eine ManyToMany Beziehung realisieren (hab ich schon probiert, aber mir fällt dann keine Möglichkeit ein den Status abzubilden)?

Vlt. hat jemand eine Lösung oder kann mir einen Tipp geben?!

MFG
 
Hi,

ich würde a) kein embedded Zeugs nehmen und b) @ManyToMany verwenden.

Da Dein State keine Assoziationsklasse im eigentlichen Sinne ist (sprich ausser den IDs keine weiteren Attribute drin sind), ist ManyToMany eine gute Lösung.

Grüße
 
So habe ich das mit @ManyToMany realisiert:

Code:
package de.bitartists.document;

import static javax.persistence.CascadeType.ALL;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name = "Documents")
public class Document implements Serializable{

	@Id
	@GeneratedValue
	private int id;

	private String name;

	@ManyToMany(mappedBy = "docs", cascade = ALL)
	private Collection<User> users = new ArrayList<User>();


	protected Document(){}


	public Document(String name){
		this.setName(name);
	}


	public int getId(){
		return this.id;
	}


	protected void setId(int id){
		this.id = id;
	}


	public String getName(){
		return name;
	}


	public void setName(String name){
		this.name = name;
	}


	public void setUsers(Collection<User> users){
		this.users = users;
	}


	public Collection<User> getUsers(){
		return users;
	}


	public void addUser(User user){
		if (!getUsers().contains(user)){
			getUsers().add(user);
		}
		if (!user.getDocs().contains(this)){
			user.getDocs().add(this);
		}
	}
}

Code:
package de.bitartists.document;

import java.util.ArrayList;
import java.util.Collection;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

@Entity
@Table(name = "Users")
public class User{

	@Id
	@GeneratedValue
	private int id;

	private String name;

	@ManyToMany
	private Collection<Document> docs = new ArrayList<Document>();


	public User(){}


	public User(String name){
		this.setName(name);
	}


	public void setId(int id){
		this.id = id;
	}


	public int getId(){
		return id;
	}


	public void setName(String name){
		this.name = name;
	}


	public String getName(){
		return name;
	}


	public void setDocs(Collection<Document> docs){
		this.docs = docs;
	}


	public Collection<Document> getDocs(){
		return docs;
	}
}



Allerdings habe ich jetzt keine Idee, wie ich den Status da unter bekomme?
 

Neue Beiträge

Zurück