gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 01:41:09 24 4
gpt4 key购买 nike

我有 webapp,它使用 Hibernate 4Spring 3MySQL。 Hibernate session 和事务由 spring 管理。

现在我对如何使用 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 表生成的:

计算机应用程序.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;
}

}

如何使用 Hibernate 在 computer_app 数据表中saveOrUpdate() 数据?必须创建 2 个生成类的哪个实例 - 一个或两个?

请指出解决方案或提供一些代码..我真的需要把它做到明天!每个答案都受到高度赞赏并立即回复!如果您需要一些额外的代码 - 请告诉我。

谢谢。

最佳答案

如下定义 @manytomany ComputerApplication 表之间的关系 hibernate 将负责将记录插入到您的 computer_app table 不需要为 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

希望这能解决您的问题...!

关于java - 使用 Hibernate + MySQL 保存或更新多对多表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21606034/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com