Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在hibernate的单个会话中执行两次保存(“实体名称”,对象)?_Java_Hibernate - Fatal编程技术网

Java 在hibernate的单个会话中执行两次保存(“实体名称”,对象)?

Java 在hibernate的单个会话中执行两次保存(“实体名称”,对象)?,java,hibernate,Java,Hibernate,我有一个POJO类NewUniversity.java。我已经为它创建了一个映射文件,即。RegisterAction.hbm.xml。现在的问题是,当我试图从DAO类调用save方法时,只执行第一个,而第二个不执行。我有两个表通过xml文件中的“实体映射”属性链接到一个实体 文件:NewUniversity.java public class NewUniversity implements Serializable { // University fields private String

我有一个POJO类NewUniversity.java。我已经为它创建了一个映射文件,即。RegisterAction.hbm.xml。现在的问题是,当我试图从DAO类调用save方法时,只执行第一个,而第二个不执行。我有两个表通过xml文件中的“实体映射”属性链接到一个实体

文件:NewUniversity.java

public class NewUniversity implements Serializable {

// University fields
private String uCode;
private String uName;
private String uAddress;
private String uCity;
private String uState;
private long uContactNo;
private String uEmail;

// University director fields
private String name;
private String address;
private String city;
private String state;
private long contactNo;
private String email;
private String userName;
private String pwd;

public String getuCode() {
    return uCode;
}

public void setuCode(String uCode) {
    this.uCode = uCode;
}

public String getuName() {
    return uName;
}

public void setuName(String uName) {
    this.uName = uName;
}

public String getuAddress() {
    return uAddress;
}

public void setuAddress(String uAddress) {
    this.uAddress = uAddress;
}

public String getuCity() {
    return uCity;
}

public void setuCity(String uCity) {
    this.uCity = uCity;
}

public String getuState() {
    return uState;
}

public void setuState(String uState) {
    this.uState = uState;
}

public long getuContactNo() {
    return uContactNo;
}

public void setuContactNo(long uContactNo) {
    this.uContactNo = uContactNo;
}

public String getuEmail() {
    return uEmail;
}

public void setuEmail(String uEmail) {
    this.uEmail = uEmail;
}


// University directors setters/getters
public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public String getCity() {
    return city;
}

public void setCity(String city) {
    this.city = city;
}

public String getState() {
    return state;
}

public void setState(String state) {
    this.state = state;
}

public long getContactNo() {
    return contactNo;
}

public void setContactNo(long contactNo) {
    this.contactNo = contactNo;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getUserName() {
    return userName;
}

public void setUserName(String userName) {
    this.userName = userName;
}

public String getPwd() {
    return pwd;
}

public void setPwd(String pwd) {
    this.pwd = pwd;
}

}
文件:RegisterAction.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD  3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">


<hibernate-mapping>
<class name="in.ryr.register.NewUniversity" table="university"
    entity-name="university">
    <id name="uCode" column="code" type="string">
        <generator class="assigned" />
    </id>
    <property name="uName" column="name" />
    <property name="uAddress" column="address" />
    <property name="uCity" column="city" />
    <property name="uState" column="state" />
    <property name="uContactNo" column="contact_no" />
    <property name="uEmail" column="email" />
    <property name="userName" column="username" />
</class>

<class name="in.ryr.register.NewUniversity" table="university_director"
    entity-name="uniDirector">
    <id name="userName" column="username" type="string">
        <generator class="assigned" />
    </id>
    <property name="name" column="name" />
    <property name="address" column="address" />
    <property name="city" column="city" />
    <property name="state" column="state" />
    <property name="contactNo" column="contact_no" />
    <property name="email" column="email" />
    <property name="pwd" column="password" />
    <property name="uCode" column="u_code" />
</class>
</hibernate-mapping>
我也尝试过使用persist()。但是没有运气! 关键是,当我在两个不同的会话上执行它时,它工作得非常完美。(所有对象值都通过.jsp传递到struts)。出于某些原因,我没有使用注释。

可能是因为该方法要求
对象
为“暂时”对象(即尚未持久化的对象),并且在第一次调用
session.save(“大学”,用户)之后然后
用户
不再是暂时的

持久化给定的瞬态实例,首先分配生成的 标识符。(或使用标识符属性的当前值,如果 使用指定的生成器。)此操作级联到相关的 如果关联映射为cascade=“save update”


当您在第一次
保存
之后获取持久化的“university”实体,然后将其保存为“uniDirector”时会发生什么情况?

谢谢您的回复。你能进一步告诉我这个问题的解决方法吗。我应该使用merge()或其他任何方法。另外,如何将持久化对象转换为临时对象。@SuryaDeepMishra将其从会话中删除。保存第一个实体后,尝试
session.flush()
session.clear()
创建
user
对象的新实例。更好的方法是为两个表创建单独的类。
public void register(NewUniversity user) throws Exception {
    session = factory.openSession();
    transaction = session.beginTransaction();
    try {
        session.save("university", user);   //This is working fine
        session.save("uniDirector", user);  //This doesn't execute at all
        transaction.commit();
        session.close();
    } catch (Exception e) {
        transaction.rollback();
        e.printStackTrace();
        session.close();
    }
}