2017-08-22 42 views
-3

我有一個登記表:如何使用hibernate使用具有關係映射的表單將值插入到多個表中?

<form action="${ pageContext.request.contextPath }/customer/add" method="post"> 
<div> 
    <label>Name: </label> 
    <input type="text" name="name"> 
</div> 
<div> 
    <label>Address: </label> 
    <input type="text" name="address.address"> 
</div> 
<input type="submit" value="Insert"> 

在這裏,我想插入此表的值轉換成客戶和地址帳戶具有以下POJO:

Cusotmer.java

@Id 
@GeneratedValue 
@Column 
private Long id; 
@Column 
private String name; 
@OneToOne 
@JoinColumn(name = "address_id") 
private Address address; 

Address.java

@Id 
@GeneratedValue 
@Column 
private Long id; 
@Column 
private String address; 

我創建了一個daoImpl方法來增加客戶和它們各自的地址:

CustomerDaoImpl

@Override 
@Transactional 
public void addCustomer(Customer c) { 
    session = sessionFactory.openSession(); 
    session.beginTransaction(); 
    session.save(c); 
    session.getTransaction().commit(); 
    session.close(); 
} 

AddressDaoImpl

@Override 
@Transactional 
public void addAddress(Address a) { 
    session = sessionFactory.openSession(); 
    session.beginTransaction(); 
    session.save(a); 
    session.getTransaction().commit(); 
    session.close();   
} 

CustomerController

@Autowired 
private CustomerDao customerDao; 

@Autowired 
private AddressDao addressDao; 

@RequestMapping(value="/customer/add", method = RequestMethod.POST) 
public String postCustomer(@ModelAttribute Customer c, @ModelAttribute Address a){ 
    addressDao.addAddress(a); 
    c.setAddress(a); 
    customerDao.addCustomer(c); 
    return "redirect:/customer"; 
} 

插入操作不工作的唯一地址值。客戶與相應的address_id一起被添加,但是在地址表本身中,地址名稱不會被插入,只是id被創建。

+0

*不工作*表示?任何錯誤消息? – Jens

+0

客戶與address_id一起添加,但在地址表中創建地址,但不保存表單值。 @Jens – Space

+0

在前端使用db實體並不是一個好主意。你應該使用pojo,它只存儲普通數據。一個實體在後臺有很多對象 – Jens

回答

0

變化在地址POJO私人vairable地址的名稱,以便它不會與客戶POJO地址對象對比度。

@Id 
@GeneratedValue 
@Column 
private Long id; 
@Column 
private String aName; // change is here... 

Similaly從address.addressaName只改變形式地址輸入名稱。

<form action="${ pageContext.request.contextPath }/customer/add" method="post"> 
<div> 
    <label>Name: </label> 
    <input type="text" name="name"> 
</div> 
<div> 
    <label>Address: </label> 
    <input type="text" name="aName"> // see the change here... 
</div> 
<input type="submit" value="Insert"> 

,將其餘的在控制器相同。

@RequestMapping(value="/add", method = RequestMethod.POST) 
public String postCustomer(@ModelAttribute Customer c, @ModelAttribute Address a){ 
    addressDao.addAddress(a); 
    c.setAddress(a); 
    customerDao.addCustomer(c); 
    return "redirect:/customer"; 
} 
0

我不知道我可以幫你解決問題,但可以嘗試糾正一些問題。

1)@Transactional註釋用於服務層,而不是DAO。你actualy不要同時使用@Transactional註釋和session.beginTransaction();,選擇其中

2)之一,你不必把@Column註釋每次也沒用,直到你擁有它指定一些屬性。

@Column 
private String name; 

3)使用彈簧控制器,您可以使用@PostMapping。更多關於這裏:https://spring.io/guides/gs/handling-form-submission/

希望這可以幫助,不知何故。

1

添加級聯選項,以便無論何時保存客戶,都會保存相應的地址。

@OneToOne(cascade = CascadeType.PERSIST) 
@JoinColumn(name = "address_id") 
private Address address; 

簡化控制器:

@RequestMapping(value="/customer/add", method = RequestMethod.POST) 
public String postCustomer(@ModelAttribute Customer c){ 
    customerDao.addCustomer(c); 
    return "redirect:/customer"; 

}

+0

沒有工作...在窗體中我必須更改地址輸入字段的名稱或其確定到用戶地址。地址... @ Alan Hay – Space

相關問題