2016-11-12 27 views
0

我使用JPA運行Spring MVC應用程序進行持久化。我有一個有更新按鈕的表單。當點擊這個按鈕時,它應該更新數據庫中的用戶記錄。用戶表中有嵌入的表格地址。我能夠訪問用戶表中的所有字段,但不能訪問嵌入表。這是我的請求映射從JPA嵌入表中POST訪問表單數據

@RequestMapping(value="/user/{userid}",method=RequestMethod.POST) 
public String Update(@ModelAttribute("user")User user,@PathVariable("userid") String userid,Model model){ 

這是我User.java

@Entity 
@Table(name="User") 
public class User { 
    @Id 
    @Column(name = "userid") 
    private String id; 
    @Column(name="firstname") 
    private String firstname; 
    @Column(name="lastname") 
    private String lastname; 
    @Column(name="title") 
    private String title; 
    @Embedded 
    private Address address; 
    @ManyToMany 
    @JoinTable(name="phone_user", joinColumns={@JoinColumn(name="userid")}, 
    inverseJoinColumns={@JoinColumn(name="phoneid")}) 
    private List<Phone> phones; 

    public String getId() { 
     return id; 
    } 
    public void setId(String id) { 
     this.id = id; 
    } 

    public String getFirstname() { 
     return firstname; 
    } 
    public void setFirstname(String firstname) { 
     this.firstname = firstname; 
    } 

    public String getLastname() { 
     return lastname; 
    } 
    public void setLastname(String lastname) { 
     this.lastname = lastname; 
    } 
    public String getTitle() { 
     return title; 
    } 
    public void setTitle(String title) { 
     this.title = title; 
    } 

    public Address getAddress() { 
     return address; 
    } 
    public void setAddress(Address address) { 
     this.address = address; 
    } 

    public List<Phone> getPhones() { 
     return phones; 
    } 
    public void setPhones(List<Phone> phones) { 
     this.phones = phones; 
    } 

} 注意地址字段的@Embedded標籤。 這裏是我的Address.java

@Embeddable 
public class Address { 
    String street; 
    String city; 
    String state; 
    String zip; 
    @Column(name="street") 
    public String getStreet() { 
     return street; 
    } 
    public void setStreet(String street) { 
     this.street = street; 
    } 
    @Column(name="city") 
    public String getCity() { 
     return city; 
    } 
    public void setCity(String city) { 
     this.city = city; 
    } 
    @Column(name="state") 
    public String getState() { 
     return state; 
    } 
    public void setState(String state) { 
     this.state = state; 
    } 
    @Column(name="zip") 
    public String getZip() { 
     return zip; 
    } 
    public void setZip(String zip) { 
     this.zip = zip; 
    } 


} 

這裏是我的JSP它的形式發送數據

<html> 
<head> 
    <title>Home</title> 

</head> 
<body> 
<h1> 
    Hello world! 
</h1> 



<form method="POST" action="/cmpe275/user/${userid}"> 
<table> 
<tr> 
    <td>Name</td> 
    <td><input type="text" readonly="readonly" name="userid" value="${id}"/></td> 
</tr> 
<tr><tr><tr><tr><tr><tr><tr><tr><tr> 
    <td>First Name</td> 
    <td><input type="text" name="firstname" value="${firstname}"/></td> 
    <td>Last Name</td> 
    <td><input type="text" name="lastname" value="${lastname}"/></td> 
    </tr> 
    <tr> 
    <tr><tr><tr><tr> 
    <td>Street</td> 
    <td><input type="text" name="street" value="${street}"/></td> 
    <td>City</td> 
    <td><input type="text" name="city" value="${city}"/></td> 
    <td>State</td> 
    <td><input type="text" name="state" value="${state}"/></td> 
    <td>Zip</td> 
    <td><input type="text" name="zip" value="${zip}"/></td> 
    </tr> 
    <tr><tr><tr><tr> 
    <td><input type="submit" onclick="updateUser();" name="Update" value="Update"/></td> 

    <td><input type="button" name="Delete" value="Delete"/></td> 



</table> 
</form> 
</body> 
<script> 
function updateUser(){ 
    console.log("hi"); 
} 

</script> 
</html> 

我無法訪問使用的getter/setter方法的地址字段。 例如 - 在我的處理程序映射 - 要使用獲得更新的配置文件,我可以訪問它的名字:

user.getFirstName() 

但如果我要訪問的更新地址我做了

user.getAddress.getCity() 

我得到一個空值。 任何想法爲什麼?

+0

你可以發佈一些客戶端代碼和請求的樣子? – denov

回答

1

我覺得這

<td><input type="text" name="street" value="${street}"/></td> 
<td>City</td> 
<td><input type="text" name="city" value="${city}"/></td> 
<td>State</td> 
<td><input type="text" name="state" value="${state}"/></td> 
<td>Zip</td> 
<td><input type="text" name="zip" value="${zip}"/></td> 

應該

<td><input type="text" name="address.street" value="${address.street}"/></td> 
<td>City</td> 
<td><input type="text" name="address.city" value="${address.city}"/></td> 
<td>State</td> 
<td><input type="text" name="address.state" value="${address.state}"/></td> 
<td>Zip</td> 
<td><input type="text" name="address.zip" value="${address.zip}"/></td> 

彈簧控制器期待@ModelAttribute@RequestBody進行結構像POJO。所以,如果你不建議使用的格式,併發送這個數據VS部分JS它會看起來像

{ 
    'firstname':'peter', 
    'lastname': 'griffen', 
    'address': { 
     'street':'31 Spooner Street'   
    } 
} 

你有什麼是對象完全平坦。如果您在User類中添加了正確的setter,可能會有效。

+0

這有效。你能否詳細說明並告訴我有什麼問題? – RJP