简体   繁体   English

使用Hibernate + MySQL保存或更新多对多表

[英]saveOrUpdate many-to-many table with Hibernate + MySQL

I have webapp, which uses Hibernate 4 , Spring 3 and MySQL . 我有webapp,它使用Hibernate 4Spring 3MySQL Hibernate sessions and transactions are managed by spring. 休眠会话和事务在春季之前进行管理。

Right now I am confused about how to insert data into computer_app table using Hibernate. 现在,我对如何使用Hibernate将数据插入computer_app表感到困惑。 Here's the script for creating a database: 这是用于创建数据库的脚本:

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;

And here are 2 corresponding classes, which which was generated by NetBeans for computer_app table: 这是两个对应的类,它们是由NetBeanscomputer_app表生成的:

ComputerApp.java: ComputerApp.java:

@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();
    }

}

ComputerAppId.java: 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;
    }

}

How can I saveOrUpdate() data inside the computer_app datatable with Hibernate? 我怎样才能saveOrUpdate()的内部数据computer_app与Hibernate的数据表? Which instance of 2 generated classes must be created - one or both? 必须创建2个生成类的哪个实例-一个还是两个都创建?

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. 如果您需要一些其他代码-请让我知道。

Thank you. 谢谢。

Deffine @manytomany relationship between your Computer and Application tables as follows hibernate will take care of inserting records into your computer_app table there is no need to define separate table for computer_app table as follows 如下@manytomany您的ComputerApplication表之间的@manytomany关系休眠将负责将记录插入到您的computer_app表中,而无需为computer_app表定义单独的表,如下所示

Computer 电脑

@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

}

Application 应用

@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

}

save entities 保存实体

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();

this will automatically insert records into all three tables 这将自动将记录插入所有三个表中

for more reference read this article 有关更多参考,请阅读本文

Hibernate Many To Many Annotation Mapping Tutorial 休眠多对多注释映射教程

hope this will solve your problem ...! 希望这能解决您的问题...!

You could save an object with the EntityManager: 您可以使用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();

} }

You just need to create one new Computer as: 您只需要创建一台新计算机,如下所示:

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

and one Application as: 一个应用程序为:

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

Then you will do: 然后,您将执行以下操作:

ComputerApp ca = new ComputerApp(a,c);

and then you can persist it as Janus mentioned. 然后您可以按照Janus所述坚持下去。 Hibernate will take care of the foreign keys since you will pass computer c and application a as parameters in the constructor Hibernate将处理外键,因为您将在构造函数中传递计算机c和应用程序a作为参数

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM