当级级联保存时,如果多的一方放弃了外键的控制,也就是使用了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);
}
}
运行结果如下
总结
在多的一方放弃外键时,要在一的一方和多的一方同时设置属性。