简体   繁体   中英

saveOrUpdate many-to-many table with Hibernate + MySQL

I have webapp, which uses Hibernate 4 , Spring 3 and MySQL . Hibernate sessions and transactions are managed by spring.

Right now I am confused about how to insert data into computer_app table using Hibernate. 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:

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:

@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? Which instance of 2 generated classes must be created - one or both?

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

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:

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. Hibernate will take care of the foreign keys since you will pass computer c and application a as parameters in the constructor

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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