JPA插入操作异常:关联Address表时member_id为null导致插入失败
Let's walk through the problems in your setup and fix them to get the Address data inserted correctly:
1. Critical Mapping Error in Address Entity
First off, there's a clear mistake in your Address entity's mapping code. You've accidentally associated Address with itself instead of the Member entity:
// Wrong code in Address class @OneToOne(cascade=CascadeType.ALL) @JoinColumn(name = "MEMBER_ID") private Address address;
This should be corrected to reference the Member class, since Address is linked to a Member:
// Corrected code in Address class @OneToOne(cascade=CascadeType.ALL) @JoinColumn(name = "MEMBER_ID") private Member member;
2. Properly Maintain Bidirectional Association
Since your Member entity uses mappedBy="member", that makes the Address entity the owning side of the one-to-one relationship. For JPA to correctly populate the MEMBER_ID column in the Address table, you need to set the association on both sides when creating your entities:
// Create and configure Student Student student = new Student(); student.setName("John Doe"); // Set other Student/Member fields (lastupdateddate, lastupdatedby) // Create and configure Address Address address = new Address(); address.setClass("Class A"); // Set other Address fields // Link both sides of the association student.setAddress(address); address.setMember(student); // This line is crucial - it tells JPA which Member this Address belongs to // Save the Student (cascade will handle saving the Address) studentRepository.saveAndFlush(student);
Without setting address.setMember(student), JPA has no way to know which Member the Address is associated with, so it inserts the Address with a null MEMBER_ID.
3. Verify Inheritance Configuration for Member/Student/Teacher
Since you're using shared primary keys for Member, Student, and Teacher, make sure your abstract Member class has the correct inheritance strategy configured. For a joined table inheritance (which makes sense for your shared PK setup), add this annotation to the Member class:
@Entity @Inheritance(strategy = InheritanceType.JOINED) public abstract class Member implements Serializable { // Your existing fields and mappings }
This ensures that the Student and Teacher tables share the primary key with the Member table, which is required for your one-to-one shared PK setup.
4. Fix Typo in Field Names (Optional but Recommended)
I noticed a typo in your entity field names: latupdateddate and latupdatedby should likely be lastUpdatedDate and lastUpdatedBy (following Java naming conventions). While this doesn't directly cause the Address insertion issue, fixing it will make your code more maintainable.
内容的提问来源于stack exchange,提问作者Rajeev K M

