【问题标题】:Spring mvc foreign field in table won't update表中的 Spring mvc 外部字段不会更新
【发布时间】:2017-05-01 04:29:58
【问题描述】:

我有 2 个模型,在 db 中有 ff 列:

ContractHeader
id = primary key
con_num

ContractEntitlement
id = primary key
ch_id = foreign key to id in ContractHeader table
category

一个合同标题可以有多个合同权利。模型类是:

ContractHeader.java

@Entity
@Table(name = "CONTRACT_HEADER")
public class ContractHeader {

    @Id
    @Column(name = "id", unique = true, nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "contractHeader")
    private List<ContractEntitlement> contractEntitlements;

    @Column(name = "con_num")
    private String conNum;
    getter and setter ....

合同权利

@Entity
@Table(name = "CONTRACT_ENTITLEMENT")
public class ContractEntitlement {

    @Id
    @Column(name = "id", unique = true, nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ch_id", referencedColumnName = "id")
    private ContractHeader contractHeader; 

    @Column(name = "category")
    private String category;

   getter and setter ....

当我从 jsp 保存日期时,它会在 spring 中正确插入每个表中没有错误的值,但 ch_id 字段(foreign_key)始终为空。知道为什么 ch_is 没有被 contractheader 表中的 id 填充吗?

【问题讨论】:

  • 您希望自动填充 ch_id 还是从表单发送 ch_id 的值,但仍然为它插入 null?
  • 合约标头的 id 在从表中保存(序列化)后填充。我假设将 id 映射到 ch_id 将自动填充表中的 ch_id。我不发送表单中的 ch_id。
  • 我想得越多,我想这需要在数据库端完成(存储过程)。有没有cmets?
  • 是的@Arnold,您需要在 DB 端处理这种情况,因为 Spring 将无法识别需要在 ch_id 中填充哪个 id。

标签: java mysql spring spring-mvc


【解决方案1】:

这并不完全是问题的答案,而是更多的解决方法并希望分享。我不是在数据库端进行处理,而是在会话保存后关闭之前获取 id:

public String addContractHeader(@Validated @ModelAttribute("contractHeader") ContractHeader p, BindingResult bindingResult, Model model) {

    System.out.println("BEFORE " + p.getId());
    this.contractHeaderService.addContractHeader(p);
    System.out.println("AFTER " + p.getId());
    for (Iterator<ContractEntitlement> i = p.getContractEntitlements().iterator(); i.hasNext();) {
        ContractEntitlement employee = i.next();
        -- use p.getId() to store in ch_id (foreign_key)
        this.contractEntitlementService.addContractEntitlement(employee);

    }

BEFORE 0
Hibernate: insert into CONTRACT_HEADER (contact_email, contact_number, contact_person, contract_number, contract_package, contract_status, contract_sum, contract_type, currency_type, customer_address, customer_name, expiry_date, package_other, remarks, start_date) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Info: INFO : com.at.ccts.dao.ContractHeaderDAOImpl - ContractHeader saved successfully, ContractHeader Details=com.at.ccts.model.ContractHeader@39d1a603
2017-05-01T20:01:52.537+0800|Info:
AFTER 19

我将 id 存储在数据库中(序列化)。

【讨论】:

    猜你喜欢
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    相关资源
    最近更新 更多