0 Replies Latest reply: Oct 29, 2010 6:19 AM by 809259 RSS

    A sense of style: @OneToMany or @ElementCollection?

    809259
      Hello, everybody!

      First of all, I would like to say that I already posted this question in another forum:

      [https://forum.hibernate.org/viewtopic.php?f=1&t=1007832]

      but as I haven't got any answer from there I'm posting it here too in the hope that I find one, as this is very important to me.

      In JPA 1.0 I could map the collection association to DocumentSubject (only accessible through the Document entity) like this:
      @Entity
      @Table(name = "SUBJECTS")
      public class Subject
      {
          @Id
          @Column(name = "SUBJECT_ID")
          private int id;
          
          private String description;
      
          // Getters and setters...
      }
      
      @Embeddable
      public class DocumentSubjectId implements Serializable
      {
          @Column(name = "DOCUMENT_ID")
          private int documentId;
          
          @Column(name = "ITEM_ID")
          private int item;
      
          // Getters and setters, equals and hashcode...
      }
      
      @Entity
      @Table(name = "DOCUMENT_SUBJECTS")
      public class DocumentSubject
      {
          @EmbeddedId
          private DocumentSubjectId id;
      
          @ManyToOne
          @JoinColumn(name = "SUBJECT_ID")
          private Subject subject;
      
          @ManyToOne
          @JoinColumn(name = "DOCUMENT_ID", referencedColumnName = "DOCUMENT_ID", insertable = false, updatable = false)
          private Document document; // See below for the Document class...
      
          // Getters and setters...
      }
      
      @Entity
      @Table(name = "DOCUMENTS")
      public class Document
      {
          @Id
          @Column(name = "DOCUMENT_ID")
          private int id;
      
          @OneToMany(mappedBy = "document", cascade = {CascadeType.ALL})
          private List<DocumentSubject> subjects = new ArrayList<DocumentSubject>();
      
          // Getters and setters...
      }
      In JPA 2.0 I can get rid of the DocumentSubjectId class, transform DocumentSubject in an @Embeddable and use the @ElementCollection annotation, like this:
      @Embeddable
      public class DocumentSubject
      {
          @Column(name = "ITEM_ID")
          private short item;
      
          @ManyToOne
          @JoinColumn(name = "SUBJECT_ID")
          private Subject subject;
      
          // Getters and setters...
      }
      
      @Entity
      @Table(name = "DOCUMENTS")
      public class Document
      {
          @Id
          @Column(name = "DOCUMENT_ID")
          private int id;
      
          @ElementCollection
          @CollectionTable(name = "DOCUMENT_SUBJECTS", joinColumns = @JoinColumn(name = "DOCUMENT_ID"))
          private List<DocumentSubject> subjects = new ArrayList<DocumentSubject>();
      
          // Getters and setters...
      }
      So, my question is: what is the recommended to use in this case: relationships to entity classes, like in the first case, or collection of embedded classes, like the second case? Note that I will never access in my application the DocumentSubject separately from the Document class. It really belongs to the Document class. What would you use in JPA 2.0, and why?

      Thank you in advance.

      Marcos