title: saveOrUpdate many-to-many table with Hibernate + MySQL
body: <p>I have webapp, which uses <code>Hibernate 4</code>, <code>Spring 3</code> and <code>MySQL</code>. Hibernate sessions and transactions are managed by spring.</p>
  
  <p>Right now I am confused about how to insert data into <code>computer_app</code> table using Hibernate.
  Here's the script for creating a database:</p>
  
  <pre><code>CREATE TABLE computers (
  computer_id INT AUTO_INCREMENT,
  computer_name VARCHAR(15) NOT NULL,
  ip_address VARCHAR(15) NOT NULL UNIQUE,
  login VARCHAR(20) NOT NULL,
  password VARCHAR(20) NOT NULL,
  PRIMARY KEY(computer_id)
  ) ENGINE=InnoDB;
  
  CREATE TABLE applications (
  app_id INT AUTO_INCREMENT,
  app_name VARCHAR(255) NOT NULL,
  vendor_name VARCHAR(255) NOT NULL,
  license_required TINYINT(1) NOT NULL,
  PRIMARY KEY(app_id)
  ) ENGINE=InnoDB;
  
  CREATE TABLE computer_app (
  computer_id INT,
  app_id INT,
  FOREIGN KEY (computer_id)
      REFERENCES computers(computer_id)
      ON DELETE CASCADE,
  FOREIGN KEY (app_id)
      REFERENCES applications(app_id)
      ON DELETE CASCADE
  ) ENGINE = InnoDB;
  </code></pre>
  
  <p>And here are 2 corresponding classes, which which was generated by <code>NetBeans</code> for <code>computer_app</code> table:</p>
  
  <p>ComputerApp.java:</p>
  
  <pre><code>@Entity
  @Table(name="computer_app" ,catalog="adminportal")
  public class ComputerApp  implements Serializable {
  
      @EmbeddedId
      @AttributeOverrides( {
          @AttributeOverride(name="computerId", column=@Column(name="computer_id") ), 
          @AttributeOverride(name="appId", column=@Column(name="app_id") ) } )
       private ComputerAppId id;
  
      @ManyToOne(fetch=FetchType.EAGER)
      @JoinColumn(name="app_id", insertable=false, updatable=false)
       private Application applications;
  
      @ManyToOne(fetch=FetchType.EAGER)
      @JoinColumn(name="computer_id", insertable=false, updatable=false)
       private Computer computers;
  
      public ComputerApp() {
      }
  
      public ComputerApp(Application applications, Computer computers) {
          this.applications = applications;
          this.computers = computers;
      }
  
      public ComputerAppId getId() {
          return id;
      }
  
      public void setId(ComputerAppId id) {
          this.id = id;
      }
  
      public Application getApplications() {
          return applications;
      }
  
      public void setApplications(Application applications) {
          this.applications = applications;
      }
  
      public Computer getComputers() {
          return computers;
      }
  
      public void setComputers(Computer computer) {
          this.computers = computer;
      }
  
      @Override
      public String toString() {
          return applications.getAppName();
      }
  
  }
  </code></pre>
  
  <p>ComputerAppId.java:</p>
  
  <pre><code>@Embeddable
  public class ComputerAppId implements Serializable {
  
      @Column(name = "computer_id")
      private Integer computerId;
  
      @Column(name = "app_id")
      private Integer appId;
  
      public ComputerAppId(){
  
      }
  
      public ComputerAppId(Integer computerId, Integer appId) {
          this.computerId = computerId;
          this.appId = appId;
      }
  
      public Integer getComputerId() {
          return this.computerId;
      }
  
      public void setComputerId(Integer computerId) {
          this.computerId = computerId;
      }
  
      public Integer getAppId() {
          return this.appId;
      }
  
      public void setAppId(Integer appId) {
          this.appId = appId;
      }
  
      public boolean equals(Object other) {
          if ((this == other)) {
              return true;
          }
          if ((other == null)) {
              return false;
          }
          if (!(other instanceof ComputerAppId)) {
              return false;
          }
          ComputerAppId castOther = (ComputerAppId) other;
  
          return ((this.getComputerId() == castOther.getComputerId()) || (this.getComputerId() != null &amp;&amp; castOther.getComputerId() != null &amp;&amp; this.getComputerId().equals(castOther.getComputerId())))
                  &amp;&amp; ((this.getAppId() == castOther.getAppId()) || (this.getAppId() != null &amp;&amp; castOther.getAppId() != null &amp;&amp; this.getAppId().equals(castOther.getAppId())));
      }
  
      public int hashCode() {
          int result = 17;
  
          result = 37 * result + (getComputerId() == null ? 0 : this.getComputerId().hashCode());
          result = 37 * result + (getAppId() == null ? 0 : this.getAppId().hashCode());
          return result;
      }
  
  }
  </code></pre>
  
  <p>How can I <code>saveOrUpdate()</code> data inside the <code>computer_app</code> datatable with Hibernate? Which instance of 2 generated classes must be created - one or both?</p>
  
  <p>Please, point me to the solution or provide some code..I realy need to make this till tomorrow! Every answer is highly appreciated and responded immidiately! If you need some additional code - just let me know.</p>
  
  <p>Thank you.</p>