2010-07-11 130 views
0

我想用hibernate和struts2建立一個登錄頁面。我的設計如下。每個登錄用戶都有一個角色。許多用戶可以具有相同的角色。
所以我的課是:
User.javastruts2的休眠映射

@Entity 
@Table(name = "user", catalog = "ciner") 
public class User implements java.io.Serializable { 

    private Integer userId; 
    private Role role; 
    private String loginId; 
    private String password; 
    private String firstName; 
    private String lastName; 

    public User() { 
    } 

    public User(Role role, String loginId, String password, String firstName, String lastName) { 
     this.role = role; 
     this.loginId = loginId; 
     this.password = password; 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "user_id") 
    public Integer getUserId() { 
     return this.userId; 
    } 

    public void setUserId(Integer userId) { 
     this.userId = userId; 
    } 

    @Column(name = "password", nullable = false) 
    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "role_id") 
    public Role getRole() { 
     return this.role; 
    } 

    public void setRole(Role role) { 
     this.role = role; 
    } 

    @Column(name = "login_id", nullable = false, length = 7) 
    public String getLoginId() { 
     return this.loginId; 
    } 

    public void setLoginId(String loginId) { 
     this.loginId = loginId; 
    } 

    @Column(name = "first_name", nullable = false, length = 50) 
    public String getFirstName() { 
     return this.firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    @Column(name = "last_name", nullable = false, length = 50) 
    public String getLastName() { 
     return this.lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    @Override 
    public String toString() { 
     return "User{" + "userId=" + userId + "role=" + role + "loginId=" 
       + loginId + "firstName=" + firstName + "lastName=" + lastName 
       + '}'; 
    } 

} 

Role.java

@Entity 
@Table(name = "role", catalog = "ciner") 
public class Role implements java.io.Serializable { 

    private Integer roleId; 
    private String roleDescription; 
    private List users; 

    public Role() { 
    } 

    public Role(String roleDescription) { 
     this.roleDescription = roleDescription; 
    } 

    public Role(String roleDescription, List users) { 
     this.roleDescription = roleDescription; 
     this.users = users; 
    } 

    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "role_id", unique = true, nullable = false) 
    public Integer getRoleId() { 
     return this.roleId; 
    } 

    public void setRoleId(Integer roleId) { 
     this.roleId = roleId; 
    } 

    @Column(name = "role_description", nullable = false, length = 100) 
    public String getRoleDescription() { 
     return this.roleDescription; 
    } 

    public void setRoleDescription(String roleDescription) { 
     this.roleDescription = roleDescription; 
    } 

    // @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = 
    // "role") 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "role", targetEntity = User.class) 
    public List getUsers() { 
     return this.users; 
    } 

    public void setUsers(List users) { 
     this.users = users; 
    } 

    @Override 
    public String toString() { 
     return "Role{" + "roleId=" + roleId + "roleDescription=" 
       + roleDescription + "users=" + users + '}'; 
    } 
} 

它返回1個用戶就好了,如果它是有效的。但是,由於該方法返回該用戶回來,我用return users.get(0);

堆棧

java.lang.StackOverflowError 
    java.lang.Integer.toString(Unknown Source) 
    java.lang.Integer.toString(Unknown Source) 
    java.lang.String.valueOf(Unknown Source) 
    java.lang.Integer.toString(Unknown Source) 
    java.lang.String.valueOf(Unknown Source) 
    java.lang.StringBuilder.append(Unknown Source) 
    com.inhis.model.Role.toString(Role.java:70) 
    sun.reflect.GeneratedMethodAccessor293.invoke(Unknown Source) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    java.lang.reflect.Method.invoke(Unknown Source) 
    org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:197) 
    com.inhis.model.Role_$$_javassist_6.toString(Role_$$_javassist_6.java) 
    java.lang.String.valueOf(Unknown Source) 
    java.lang.StringBuilder.append(Unknown Source) 
    com.inhis.model.User.toString(User.java:97) 
    java.lang.String.valueOf(Unknown Source) 
    java.lang.StringBuilder.append(Unknown Source) 
    java.util.AbstractCollection.toString(Unknown Source) 
    org.hibernate.collection.PersistentBag.toString(PersistentBag.java:507) 

說,角色是
1,未經授權
2,經理
3,用戶
我是什麼做錯了?另外,我想給它們分配一個默認角色1.我無法弄清楚。所以,我現在將它存儲爲空。我怎樣才能做到這一點?

回答

0

您創建了一個無限循環。 如果您調用某個角色的toString方法,則會爲每個用戶調用toString方法,然後再次調用該角色的toString。 一個可能的解決方案是從角色類中刪除這個:

"users=" + users + 
+0

直到你DA MAN。你不知道,這讓我付出了多少痛苦。愚蠢的我!非常感謝。這工作!唷! 呵呵,我怎樣才能將用戶的role_id設置爲1?截至目前,它被存儲爲空。 – Nish 2010-07-11 23:15:43

+0

當實體將時間戳或其他實體稱爲屬性時。你如何設置它們的默認值? – Nish 2010-07-17 21:51:23

+0

我不知道如何設置真正的SQL默認值,但你可以在構造函數中設置這些默認值或像這樣: private String myProperty =「defaultValue」; – Till 2010-07-23 13:38:27