【问题标题】:Accessing form data from POST in JPA embedded table从 JPA 嵌入表中的 POST 访问表单数据
【发布时间】:2016-11-12 01:10:45
【问题描述】:

我正在使用 JPA 运行 Spring MVC 应用程序以实现持久性。我有一个带有更新按钮的表单。单击此按钮时,它应该更新数据库中的用户记录。 User 表中有一个嵌入的表 Address。我能够访问用户表中的所有字段,但不能访问嵌入表。这是我的请求映射

@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 标签。 这是我的地址.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()

我得到一个空值。 知道为什么吗?

【问题讨论】:

  • 你能发布一些客户端代码和请求是什么样的吗?

标签: java spring jpa


【解决方案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。因此,如果您不使用表单并发送此数据而不是某些 js,它看起来像

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

你所拥有的是完全平坦的物体。如果您在 User 类中添加正确的设置器,这可能会起作用。

【讨论】:

  • 这行得通。您能否详细说明并告诉我问题出在哪里?
猜你喜欢
  • 2014-02-26
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
相关资源
最近更新 更多