我有兩個物體與關系一對一(機構地址)。我正在嘗試使用一個控制器將這兩個物體保存到資料庫中。我可以保存地址,但不能保存代理物體。
這是我的例外:
出現意外錯誤(型別=內部服務器錯誤,狀態=500)。not-null 屬性參考空值或瞬態值:com.example.demo.agency.Agency.address;嵌套例外是 org.hibernate.PropertyValueException:非空屬性參考空值或瞬態值:com.example.demo.agency.Agency.address org.springframework.dao.DataIntegrityViolationException:非空屬性參考空值或瞬態值: com.example.demo.agency.Agency.address; 嵌套例外是 org.hibernate.PropertyValueException: not-null 屬性參考空值或瞬態值:com.example.demo.agency.Agency.address
代理.java
package com.example.demo.agency;
import com.example.demo.address.Address;
import lombok.*;
import javax.persistence.*;
@Entity(name = "agency")
@Table(name = "agency")
@Data
@ToString
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class Agency {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id",nullable = false)
private Long id;
@Column(name = "phoneNumber")
private String phoneNumber;
@Column(name = "openHours")
private String openHours;
@Column(name = "email")
private String email;
@OneToOne(fetch = FetchType.EAGER,optional = false)
@JoinColumn(name="addressid",referencedColumnName = "id",nullable = false)
private Address address;
public Agency(String phoneNumber,String openHours, String email) {
this.phoneNumber = phoneNumber;
this.openHours = openHours;
this.email = email;
}
}
地址.java
package com.example.demo.address;
import com.example.demo.agency.Agency;
import lombok.*;
import javax.persistence.*;
@Entity(name = "address")
@Table(name = "address")
@Data
@ToString
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id",nullable = false)
private Long id;
@Column(name = "postalCode")
private String postalCode;
@Column(name = "street")
private String street;
@Column(name = "streetNumber")
private int streetNumber;
@OneToOne(mappedBy = "address",fetch = FetchType.LAZY,cascade = CascadeType.ALL)
private Agency agency;
public Address(String postalCode,String street,int streetNumber) {
this.postalCode = postalCode;
this.street = street;
this.streetNumber = streetNumber;
}
}
代理控制器.java
package com.example.demo.agency;
import com.example.demo.address.Address;
import com.example.demo.address.AddressService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import javax.swing.*;
@Controller
public class AgencyController {
private AgencyService agencyService;
private AddressService addressService;
@Autowired
public AgencyController(AgencyService agencyService,AddressService addressService) {
this.agencyService = agencyService;
this.addressService = addressService;
}
@GetMapping("/agencies")
public String getAgencies(Model model) {
model.addAttribute("agencies",agencyService.getAgencies());
return "agencies";
}
/* GET HTTP Request for form to add new agency to database */
@GetMapping("/agencies/new")
public String newAgencyPage(Model model) {
Agency newAgency = new Agency();
Address newAddress = new Address();
model.addAttribute("agency",newAgency);
model.addAttribute("address",newAddress);
return "newAgency";
}
/* POST HTTP Request for put data to database*/
@PostMapping("/agencies/save")
public String saveAgency(@ModelAttribute("agency") Agency agency,@ModelAttribute("address") Address address) {
agencyService.saveAgency(agency);
addressService.saveAddress(address);
return "redirect:/agencies";
}
}
新代理.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="ISO-8859-1">
<title>Agencies</title>
<link rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"
integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO"
crossorigin="anonymous">
</head>
<body>
<div class="container">
<h2>Save Agency</h2>
<form action="#" th:action="@{/agencies/save}"
method="POST">
<input type="text" th:value="*{agency.phoneNumber}" name="phoneNumber"
placeholder="Agency Phone Number" class="form-control mb-4 col-4" >
<input type="text" th:value="*{agency.openHours}" name="openHours"
placeholder="Agency OpenHours" class="form-control mb-4 col-4">
<input type="text" th:value="*{agency.email}" name="email"
placeholder="Agency Email" class="form-control mb-4 col-4">
<input type="text" th:attr="data-department=${agency.address!=null}?${agency.address.street}:'not specified'" name="street"
placeholder="Street" class="form-control mb-4 col-4">
<input type="text" th:attr="data-department=${agency.address!=null}?${agency.address.streetNumber}:'not specified'" name="streetNumber"
placeholder="Street Number" class="form-control mb-4 col-4">
<input type="text" th:attr="data-department=${agency.address!=null}?${agency.address.postalCode}:'not specified'" name="postalCode"
placeholder="Postal Code" class="form-control mb-4 col-4">
<button type="submit" class="btn btn-info col-2"> Save Agency</button>
</form>
<hr>
<a th:href = "@{/agencies}"> Back to Agency List</a>
</div>
</body>
</html>
uj5u.com熱心網友回復:
正如例外訊息所說,該Agency.address屬性為空,盡管它用nullable=false屬性標記。可能它是空的,因為你沒有在任何地方設定它來指向address實體。
由于您的關系是雙向的,因此您必須從雙方進行設定。我想你需要在你的saveAgency方法中添加這樣的東西:
agency.setAddress(address);
address.setAgency(agency);
agencyService.saveAgency(agency);
addressService.saveAddress(address);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/365864.html
