2014-02-06 43 views
1

我有webapp,它使用Hibernate 4,Spring 3MySQL。 Hibernate會話和事務由spring進行管理。saveOrUpdate帶有Hibernate + MySQL的多對多表格

現在我感到困惑的是如何將數據插入使用Hibernate computer_app表。 這裏的腳本創建數據庫:

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; 

而且這裏有2對應的類,這是由NetBeanscomputer_app表中生成:

ComputerApp.java:

@Entity 
@Table(name="computer_app" ,catalog="adminportal") 
public class ComputerApp implements Serializable { 

    @EmbeddedId 
    @AttributeOverrides({ 
     @AttributeOverride(name="computerId", [email protected](name="computer_id")), 
     @AttributeOverride(name="appId", [email protected](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(); 
    } 

} 

ComputerAppId。 Java的:

@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 && castOther.getComputerId() != null && this.getComputerId().equals(castOther.getComputerId()))) 
       && ((this.getAppId() == castOther.getAppId()) || (this.getAppId() != null && castOther.getAppId() != null && 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; 
    } 

} 

我該如何才能saveOrUpdate()computer_app數據與Hibernate數據?必須創建2個生成類的哪個實例 - 其中一個還是兩個?

請點我的解決方案或者提供一些code..I真的需要,使這個到明天!每一個答案都是高度讚賞和迴應immidiately!如果你需要一些額外的代碼 - 只是讓我知道。

謝謝。

回答

1

Deffine @manytomany如下Hibernate會採取插入記錄照顧到您的computer_app桌子上有你的ComputerApplication表之間的關係無需定義單獨的表computer_app表如下

計算機

@Entity 
@Table(name="computers") 
public class Computer { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column (name = "computer_id") 
private int id; 

@ManyToMany(cascade = {CascadeType.ALL},fetch=FetchType.EAGER) 
@JoinTable(name="computer_app", 
     joinColumns={@JoinColumn(name="computer_id")}, 
     inverseJoinColumns={@JoinColumn(name="app_id")}) 
private Set<Application> applications = new HashSet<Application>(); 

//Setter && Getters methods 

} 

應用

@Entity 
@Table(name="applications") 
public class Application { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column (name = "app_id") 
private int id; 

@ManyToMany(mappedBy="applications",fetch=FetchType.EAGER) 
private Set<Computer> computers = new HashSet<Computer>(); 

//Setter && Getters methods 

} 

保存實體

SessionFactory sf = HibernateUtil.getSessionFactory(); 
Session session = sf.openSession(); 
session.beginTransaction(); 

Application app1 = new Application(); 
Application app2 = new Application(); 
Computer comp = new Computer(); 
comp.getApplications().add(app1); 
comp.getApplications().add(app2); 
session.saveOrUpdate(comp); 

session.getTransaction().commit(); 
session.close(); 

這將自動記錄插入到所有三個表

更多參考閱讀這篇文章

Hibernate Many To Many Annotation Mapping Tutorial

希望這能解決您的問題......!

1

你可以保存了EntityManager對象:

public void save(ComputerApp t){ 
// begin transaction 
em.getTransaction().begin(); 
if (!em.contains(t)) { 
    // persist object - add to entity manager 
    em.persist(t); 
    // flush em - save to DB 
    em.flush(); 
} 
// commit transaction at all 
em.getTransaction().commit(); 

}

+0

但是ComputerAppId呢?我還必須提供它嗎?或者它將以某種方式從ComputerApp生成? – amenoire

+0

在我看來,它將在數據庫表中保持爲空,如果它沒有在運行時設置的話。您可以使用@GeneratedValue(strategy = GenerationType.IDENTITY)生成一個自動遞增的ID,但它不適用於Objects。 – Janus

+0

在ComputerApp類中是否存在缺少註釋? – Janus

1

你只需要創建一個新的計算機:

Computer c = new Computer(computer_name,ip_address,ip_address ,login, password); 

,並作爲一個應用程序:

Application a = new Application(app_name,vendor_name,license_required); 

然後你會這樣做:

ComputerApp ca = new ComputerApp(a,c); 

然後你可以堅持它作爲Janus提到。Hibernate會照顧外鍵的,因爲你會通過計算機C和應用作爲參數的構造函數