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

Java 使用Hibernate+;保存或更新多对多表;MySQL,java,mysql,sql,spring,hibernate,Java,Mysql,Sql,Spring,Hibernate,我有一个webapp,它使用了hibernate4、spring3和MySQL。Hibernate会话和事务由spring管理 现在,我对如何使用Hibernate将数据插入计算机应用程序表感到困惑。 以下是创建数据库的脚本: CREATE TABLE computers ( computer_id INT AUTO_INCREMENT, computer_name VARCHAR(15) NOT NULL, ip_address VARCHAR(15) NOT NULL UNIQUE, log

我有一个webapp,它使用了
hibernate4
spring3
MySQL
。Hibernate会话和事务由spring管理

现在,我对如何使用Hibernate将数据插入
计算机应用程序
表感到困惑。 以下是创建数据库的脚本:

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;
下面是由
NetBeans
computer\u app
表生成的两个对应类:

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;
    }

}
如何使用Hibernate保存或更新
computer\u应用程序
datatable中的数据?必须创建2个生成类的哪个实例-一个或两个

请给我指点解决方案或提供一些代码。我真的需要把它拖到明天!每一个答案都是高度赞赏和立即回应!如果你需要一些额外的代码,请告诉我


谢谢。

您可以使用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();

}

您可以使用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();

}

您只需创建一台新计算机,如下所示:

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和应用程序a作为参数传递

您只需创建一台新计算机作为:

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和应用程序a作为参数

Deffine
@manytomy
您的
计算机
应用程序
表之间的关系,如下所示Hibernate将负责将记录插入
计算机应用程序
表中无需为
computer\u app
表定义单独的表,如下所示

计算机

这将自动将记录插入所有三个表中

更多参考请阅读本文


希望这能解决你的问题

Deffine
@manytomy
您的
计算机
应用程序
表之间的关系如下hibernate将负责将记录插入
计算机应用程序
表无需为
计算机应用程序
表定义单独的表,如下所示

计算机

这将自动将记录插入所有三个表中

更多参考请阅读本文


希望这能解决你的问题

但是ComputerAppId呢?我也必须提供吗?或者它将以某种方式从ComputerApp生成?在我看来,如果在运行时未设置它,它将在数据库表中保持为空。您可以使用@GeneratedValue(strategy=GenerationType.IDENTITY)生成一个自动递增的id,但它不适用于对象。ComputerApp类中是否缺少用于持久化的注释?但是ComputerAppId呢?我也必须提供吗?或者它将以某种方式从ComputerApp生成?在我看来,如果在运行时未设置它,它将在数据库表中保持为空。您可以生成带有@GeneratedValue(strategy=GenerationType.IDENTITY)的自动递增id,但它不适用于对象。ComputerApp类中是否缺少用于持久化的注释?