鍍金池/ 問(wèn)答/Java  網(wǎng)絡(luò)安全/ jpa關(guān)聯(lián)非主鍵列,保存數(shù)據(jù)失敗

jpa關(guān)聯(lián)非主鍵列,保存數(shù)據(jù)失敗

例如
class表(class_id主鍵,class_code唯一)
class_id,class_code,class_name
student表(stu_id主鍵,class_code為class表的class_code)
stu_id,stu_code,stu_name,class_code

student表的class_code通過(guò)ManyToOne關(guān)聯(lián)
代碼如下,部分代碼省略

public class Class{
        @Id
        private String id;
        @Size(max = 20)
        @Column(unique = true)
        private String code;
        
        @Size(max = 200)
        private String name;
        ...
}
public class Student{
    @Id
    private String id;
    
    @Size(max = 20)
    private String code;
    
    @Size(max = 200)
    private String name;
    
    @ManyToOne
    @JoinColumn(name="classCode",referencedColumnName="code")
    private Class class;
    ...
}

現(xiàn)在有一條student數(shù)據(jù)插入操作

@Autowired
private StudentRepository stuRepository;

Student stu = new Student();
Class class = new Class();
class.setCode("class_code值");
stu.setClass(class);//關(guān)聯(lián)非主鍵code,保存數(shù)據(jù)就不行
...
stuRepository.save(stu);

之前關(guān)聯(lián)class的主鍵ID是沒(méi)有問(wèn)題的,但是關(guān)聯(lián)非主鍵code,保存數(shù)據(jù)就不行,是因?yàn)楸仨氷P(guān)聯(lián)主鍵么,我看網(wǎng)上也有很多關(guān)聯(lián)非主鍵的,說(shuō)明是可以這樣做的,就是不知道什么地方有問(wèn)題?

回答
編輯回答
陌如玉

ManyToOne的配置有問(wèn)題,修改成如下:

public class Student{
    @Id
    private String id;
    
    @Size(max = 20)
    private String code;
    
    @Size(max = 200)
    private String name;
    
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name="classCode")
    private Class class;
    ...
}

我本地測(cè)試運(yùn)行通過(guò),測(cè)試環(huán)境為:

  • Spring Boot 2.0.4.RELEASE
  • Hibernate JPA 2.1
  • Hibernate 5.2.17
2017年12月27日 21:02