2010-11-07 38 views
0

我正在學習Hibernate和Play框架(同時也將Java添加到帳戶中...)。我在保存這種實體休眠中的關係問題

@Entity 
@Table(name="users") 
public class User extends Model { 



     @Required 
    public String username; 

     @Column(name="user_displayname",nullable=true) 
    public String displayname; 

     @Password 
     public String user_password; 

     @Email 
     @Column(name="user_email",nullable=false,unique=true) 
     public String user_email; 

     public String user_salt; 

     public Date user_joindate; 

     @ManyToOne 
     @JoinTable(name="users_meta") 
     public UserMeta userdata; 

     @Required 
     public boolean user_isActive; 

     @OneToOne(targetEntity=UserPhotos.class,cascade=CascadeType.ALL) 
     @JoinColumn(name="id",referencedColumnName="userID") 
     public UserPhotos userPhoto; 

     @ManyToMany(cascade=CascadeType.ALL) 
     @JoinTable(name="links_rol2user") 
     public List<Rol> rol; 
     public User (String username, models.Pass password, String user_email) { 
      this.username = username; 
      this.user_password = password.getHashedPassword(); 
      this.user_salt = password.getUserHash(); 
      this.user_email = user_email; 
      this.user_joindate = new Date(); 
      this.user_isActive = false; 

     } 

。這是當我註冊用戶

 // check if the validation has errors 
     if(validation.hasErrors()) { 
      params.flash(); // add http parameters to the flash scope 
      validation.keep(); // keep the errors for the next request 
      register(); 
     } else { 
       Cache.delete(uuid); 
       Pass pass = new Pass(password,new Date().toString()); 
       User newUser = new User(firstName, pass, email); 
       UserMeta utest = new UserMeta(newUser.id); 
       utest.setUserTownID(pueblos); 
       newUser.setUserMeta(utest); 
       newUser.save(); 
       Logger.info("NewUser ID : %s", newUser.getId()); 
//    UserMeta userInfo = new UserMeta(newUser.getId()); 
//    userInfo.setUserTownID(pueblos); 
//    userInfo.save(); 

       // TODO salvar foto a null 

       // Confirmation left 
       Cache.set("thankyou", "alright!", "3mn"); 
       thankyou(); 
     } 

我試圖挽救userMeta我的代碼的問題,它會創建一個新的記錄當我將userMeta對象設置爲newUser(現在不可見)時,但它不插入在newUser中創建的新ID。

我需要什麼樣的關係?在我現在調整代碼之前,這是一個OneToOne關係,工作得很好,但現在當我完成註冊功能時,它有點打我,我也需要保存userMeta對象..

如果您需要更多信息讓我知道,我不知道如果我解釋它好不好,只是想獲得的休眠怎麼辦關係的竅門等

添加UserMeta:

*/

@Entity 
@Table(name="users_meta") 
public class UserMeta extends Model { 

    @Lob 
    @Column(name="userBio") 
    public String userBio; 
    @Column(name="userPhotoID",nullable=true) 
    public Long userPhotoID = null; 
    @Column(name="userRoleID", nullable=false) 
    public Long userRoleID = 2L; 


    @Lob 
    public String userDescription; 
    @Column(name="userViews", nullable=false) 
    public Long userViews = 0L; 
    @Column(name="userFavoriteCount", nullable=false) 
    public Long userFavoriteCount = 0L; 
    @Column(name="userTotalComments", nullable=false) 
    public Long userTotalComments = 0L; 
    @Column(name="userTotalUploadedVideos", nullable=false) 
    public Long userTotalUploadedVideos = 0L; 

    public Long userTownID; 


    public Long userID; 
    public UserMeta() {} 
    public UserMeta(Long userid) { 
     this.userBio = "El usuario no ha escrito nada todavia!"; 
     this.userDescription = "El usuario todavia no se ha describido!"; 
     this.userID = userid; 

    } 
    public Long getUserTownID() { 
     return userTownID; 
    } 

    public void setUserTownID(Long userTownID) { 
     this.userTownID = userTownID; 
    } 
} 

//合格模型

public class Pass { 

    protected String hashed; 
    protected String userHash; 

    public Pass(String passwordToHash, String salt) { 

     StringBuffer passSalt = new StringBuffer(passwordToHash); 
     this.userHash = DigestUtils.md5Hex(salt); 
     passSalt.append(this.userHash); 
     passSalt.append(Play.configuration.getProperty("application.passwordSalt")); 

     this.hashed = DigestUtils.sha512Hex(passSalt.toString()); 

    } 
    public String getHashedPassword() { 
     return this.hashed; 
    } 
    public String getUserHash() { 

     return this.userHash; 
    } 

}

+0

UserMeta和Pass類是怎麼樣的? – 2010-11-07 20:20:35

+0

現在編輯我的帖子,歡呼 – allenskd 2010-11-07 20:34:40

回答

1

似乎有很多事情在那裏!但是從我所知道的問題來看,你的問題在於你傳遞給UserMeta的id。

當您在擴展Model時,該id將由Model類生成。但是,直到實體保存到數據庫之後纔會設置它(因爲數據庫自動生成該ID)。

因此,因爲您在將用戶對象保存之前將ID傳遞給UserMeta,所以id的值將爲空。

如果您可以在創建UserMeta對象之前保存User對象,那麼您的代碼應該可以工作。

+0

我曾經這樣做:),但然後getUserMeta(userData變量)持久性將繼續。例如,我保存User對象,發生異常,並說明有關userData(帶有連接的變量等),它必須是Transient或其他內容,因爲只要它保存用戶對象,它期望變量也有一些數據存儲。 :(......好吧,因爲我得到了我的酷回來(有幾次嘗試後有點瘋了)我會嘗試找出該怎麼做,任何建議是歡迎與武器全開:) – allenskd 2010-11-07 22:04:52

+0

一個選項將擴展GenericModel而不是模型,並創建您自己的ID,或者通過user_email進行鏈接,因爲它是唯一的,您的價值在前面。我希望知道當你首先保存你的用戶對象時你的錯誤是什麼。我不確定爲什麼會失敗。 – Codemwnci 2010-11-07 22:24:59

+0

我很抱歉,因爲遲到的答案,我忙於工作。謝謝您的幫助! – allenskd 2010-11-11 20:24:58