2017-01-03 57 views
0

我有一個POJO類NewUniversity.java。我爲它創建了一個映射文件。 RegisterAction.hbm.xml。現在的問題是,當我嘗試從DAO類調用保存方法時,只有第一個被執行,第二個沒有執行。我有兩個表通過xml文件中的'entity-mapping'屬性鏈接到一個實體。在一個休眠的會話中執行兩次保存(「實體名稱」,對象)?

文件: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> 

文件:RegisterDAO.java

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

我一直堅持用試過()以及。但沒有運氣! 重點是,當我在兩個不同的會話上執行它時,它完美地工作。 (所有的對象值都通過.jsp傳遞給struts)。由於某些原因,我沒有使用註釋。

+0

保存第一個實體後,嘗試'session.flush()'和'session.clear()' –

+0

創建'user'對象的新實例。更好的辦法是爲兩個表創建一個單獨的類。 –

回答

0

也許是因爲Session#save(entityName, object)方法需要object是「短暫的」對象(即一個尚未被持久),並且,在第一次調用session.save("university", user);後然後user沒有更短暫。

堅持給定的瞬態實例,首先分配生成的 標識符。 (或使用的標識屬性的當前值,如果使用 assigned生成器。)此操作級聯到相關 情況下,如果該協會與級聯映射=「保存更新」

當你發生什麼事在第一個save之後獲得持續的「大學」實體,然後將其保存爲「uniDirector」?

+0

謝謝Jérémy的回覆。你能否請進一步告訴我問題的解決方法。我應該使用merge()還是其他什麼。 –

+0

另外,如何將持久對象轉換爲瞬態對象。 –

+0

@SuryaDeepMishra將它從會話中刪除。 –