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.