JPA一对多外键保存失败

 

 

当级级联保存时,如果多的一方放弃了外键的控制,也就是使用了mappedBy,需要在一的一方设置属性,才能保证外键顺利保存。

验证代码如下:

设置两张表:客户表-Customer,联系人表-LinkMan

客户表与联系人表是一对多的关系

客户表

@Entity
@Table(name = "cst_customer")
@Getter
@Setter
public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "cust_id")
    private Long custId;

    @Column(name = "cust_Name")
    private String custName;

    /**
     * 当放弃外键的控制权,需要在一的一方设置这个属性
     */
    @OneToMany(mappedBy = "customer",cascade = {CascadeType.ALL})
    private Set<LinkMan> linkManHashSet = new HashSet<>();
}

联系人表

@Entity
@Table(name = "lm_linkman")
@Getter
@Setter
public class LinkMan {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long lmid;

    private String name;

    /**
     * 需要在一的一方(有外键控制权的一方)设置这个属性,才能将外键设置成功
     */
    @ManyToOne(targetEntity = Customer.class,cascade = {})
    @JoinColumn(name = "link_cst_id",referencedColumnName = "cust_id")
    private Customer customer;
}

现在,表结构是在LinkMan表设置外键,而客户表放弃对外键的控制,通过

@OneToMany(mappedBy = "customer",cascade = {CascadeType.ALL})

中的mappedBy属性表示放弃对外键控制

现在外键是由LinkMan表控制的

@ManyToOne(targetEntity = Customer.class,cascade = {})
@JoinColumn(name = "link_cst_id",referencedColumnName = "cust_id")

是参照Customer表中的cust_id,创建外键名称为

link_cst_id

的外键

测试代码

@RunWith(SpringRunner.class)
@SpringBootTest
public class testJpa {
    @Autowired
    private CustomerRepository customerRepository;

    @Test
    public void testInsert(){
        Customer customer = new Customer();
        customer.setCustName("零零壹");

        LinkMan linkMan = new LinkMan();
        linkMan.setName("小孩子");

        customer.getLinkManHashSet().add(linkMan);
        customerRepository.save(customer);
    }
}

运行结果

 

 

 在一的一方设置属性

@RunWith(SpringRunner.class)
@SpringBootTest
public class testJpa {
    @Autowired
    private CustomerRepository customerRepository;

    @Autowired
    private LinkManRepository linkManRepository;

    @Test
    public void testInsert(){
        Customer customer = new Customer();
        customer.setCustName("零零壹");

        LinkMan linkMan = new LinkMan();
        linkMan.setName("小孩子");
        //在一的一方设置多属性
        linkMan.setCustomer(customer);

        //把一赋值给多
        customer.getLinkManHashSet().add(linkMan);
        customerRepository.save(customer);
    }
}

 

运行结果如下

总结

在多的一方放弃外键时,要在一的一方和多的一方同时设置属性。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值