tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
487
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von nex_m
    nex_m nex_m ist offline Mitglied Gold
    Registriert seit
    Sep 2004
    Beiträge
    119
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    
     
    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
     

  2. #2
    gorefest gorefest ist offline Mitglied Brokat
    Registriert seit
    Apr 2009
    Beiträge
    256
    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
     

  3. #3
    Avatar von nex_m
    nex_m nex_m ist offline Mitglied Gold
    Registriert seit
    Sep 2004
    Beiträge
    119
    So habe ich das mit @ManyToMany realisiert:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    
    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?