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 オブジェクトも保存する必要があることに気付きました..

さらに情報が必要な場合は、私に知らせてください。うまく説明したかどうかはわかりません.Hibernateがどのようにリレーションを行うかを理解しようとしているだけです.

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

}

4

1 に答える 1

1

そこにはたくさんのことが起こっているようです!しかし、私が知る限り、問題は UserMeta に渡す ID にあります。

Model を拡張しているため、id は Model クラスによって生成されています。ただし、これはエンティティがデータベースに保存されるまで設定されません (ID はデータベースによって自動生成されるため)。

したがって、User オブジェクトが保存される前に ID を UserMeta に渡すため、ID の値は null になります。

UserMeta オブジェクトを作成する前に User オブジェクトを保存できれば、コードは機能するはずです。

于 2010-11-07T21:52:37.940 に答える