我有两个实体成员,部门。会员必须在某个部门。
import matplotlib.pyplot as plt
import numpy as np
x=np.array([1,3,4,6,7])
y=np.array([2,2,2,2,2])
line, = plt.plot(x, y, '*')
#points to keep
ind = [True,True,False,False,True]
line.set_markevery(ind)
plt.show()
我在控制器中的方法就是这个
public class Member {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private String number;
@NonNull
@Column(nullable=false)
private String name;
@ManyToOne
@JoinColumn(name="department_number")
@NonNull
@JsonIdentityReference
private Department department;
}
public class Department {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int department_number;
@NonNull
@Column(nullable=false, unique=true)
private String name;
@OneToMany(mappedBy="department")
@JsonBackReference
private List<Member> members;
}
当我尝试这个
时@RequestMapping(method=RequestMethod.POST, path="/member/")
public ResponseEntity<Member>
createMember(@RequestBody Member member) {
return new ResponseEntity<Member>(
memberRepository.save(member)
, HttpStatus.OK);
}
我收到此错误
POST localhost:8080/member/
{
"name": "test",
"department": {
"name": "human resource"
}
}
因为部门参数我知道这个错误。实体无法识别人力资源&#39;没有department_number(@Id)。我必须要求这个结构
"status": 500,
"error": "Internal Server Error",
"exception": "org.springframework.dao.InvalidDataAccessApiUsageException",
"message": "org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : rura6502.tistory.com.domain.Member.department -> rura6502.tistory.com.domain.Department; nested exception is java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : rura6502.tistory.com.domain.Member.department -> rura6502.tistory.com.domain.Department",
"path": "/member/"
有没有办法用我的结构创建成员?(没有department_number结构.department.name也是唯一的)
答案 0 :(得分:0)
您必须在父集合中使用cascade=CascadeType.ALL
来指示hibernate保存您的孩子。
@ManyToOne
@JoinColumn(cascade=CascadeType.ALL, name="department_number")
@NonNull
@JsonIdentityReference
private Department department;
如果您要使用双向关系,则还必须在子集合中指定级联类型。
您可能还需要修正Id
的{{1}}
答案 1 :(得分:0)
成员对象之前需要部门对象。所以可以试试这个:
@RequestMapping(method= RequestMethod.POST, path="/member")
public ResponseEntity<Member> createMember(@RequestBody Member member) {
// Get department name from json
String deptName = member.getDepartment().getName();
Department department = null;
//check if dept already exists
Department alreadyExistsDepartment = departmentRepository.findByName(deptName);
if(alreadyExistsDepartment == null){
Department department1 = new Department();
department1.setName(deptName);
department = departmentRepository.save(department1);
} else{
department = alreadyExistsDepartment;
}
member.setDepartment(department);
memberRepository.save (member);
//other code here
}
这是为实体类建模的正确方法:
<强> Member.java 强>
@Entity
public class Member {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long memberId;
@NonNull
@Column(nullable=false)
private String name;
@ManyToOne
@JoinColumn(name="department_id")
private Department department;
// getters and setters
}
<强> Department.java 强>
@Entity
public class Department {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long departmentId;
@NonNull
@Column(nullable=false, unique=true)
private String name;
@OneToMany(mappedBy="department")
@JsonBackReference
private List<Member> members;
// getters and setters
}
<强> DepartmentRepository.java 强>
@Repository
public interface DepartmentRepository extends JpaRepository<Department, Long> {
Department findByName(String name);
}