@Entity
@Table(name = "applicant")
public class Applicant implements Serializable {
private static final long serialVersionUID = -8634638904962909584L;
// Primary id required by Hibernate
@Id
@GeneratedValue(strategy=IDENTITY)
@Column(name = "applicant_id", nullable=false, unique=true)
private Long applicantId; // Unique id for each applicant
@OneToOne(cascade = CascadeType.ALL)
@Fetch(value = FetchMode.SELECT)
@JoinColumn(name = "applicant_id", referencedColumnName= "applicant_id")
private DS1350 ds1350;
public Applicant () {
}
}
@Entity
@Table(name = "ds_1350")
public class DS1350 implements Serializable {
private static final long serialVersionUID = -7370747595057569296L;
// Primary id required by Hibernate
@Id
@GeneratedValue(strategy=IDENTITY)
@Column(name = "ds_1350_id", nullable=false, unique=true)
private Long ds1350Id;
@Column(name = "applicant_id", unique=true, nullable=false)
// @GeneratedValue(generator="gen")
// @GenericGenerator(name = "gen", strategy = "foreign", parameters = @Parameter(name = "property", value = "applicant"))
private Long applicantId; // Unique id for each applicant
@Column(name = "ds1350_no", length = 50)
private String ds1350Number;
}
public class ApplicantDaoTest {
@Autowired
private ApplicantDao applicantDao;
private Applicant applicant;
private DS1350 ds1350 = new DS1350();
@BeforeClass
public static void beforeClass() {
}
@AfterClass
public static void afterClass() {
}
@Before
public void setup() {
this.initApplicant();
}
@After
public void teardown() {
}
private void initApplicant() {
applicant = new Applicant();
applicant.setFirstName("John");
Calendar calendar = Calendar.getInstance();
applicant.setDob(calendar);
applicant.setSsn("123456789");
applicant.setCreatedBy("JUNIT");
applicant.setCreatedDate(Calendar.getInstance());
applicant.setModifiedBy("JUnit");
applicant.setModifiedDate(Calendar.getInstance());
this.initDS1350();
}
private void initDS1350 () {
ds1350.setDs1350Number("ds1350Number");
ds1350.setCreatedBy("JUNIT");
ds1350.setCreatedDate(Calendar.getInstance());
applicant.setDs1350(ds1350);
}
@Test
public void testSaveApplicant() {
Long applicantId = applicantDao.saveApplicant(applicant);
applicant = applicantDao.getApplicantByPrimaryKey(applicantId);
assertTrue("ds1350Number".equals(applicant.getDs1350().getDs1350Number()));
}
}
这是ds1350和申请人类别的代码。我使用休眠会话save()保存申请人对象中包含ds1350的申请人。我有一个很好的OneToMany,但是这个OneToOne无法正常工作。 Applicant.getDs1350()会引发NullPointerException,因为外键(ds1350中的applicant_id)被保存为null,applicantDao.getApplicantByPrimaryKey(applicantId)无法获取ds1350对象。
最佳答案
摆脱“ @Fetch(value = FetchMode.SELECT)”。您要告诉它在OneToOne批注中急切地获取,然后告诉它使用该@Fetch批注来延迟获取。
另外,请确保ds1350字段上的联接列具有正确的FK字段引用(如果Applicant中的字段未称为id)。
@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "applicant_id", referencedColumnName= "applicant_id")
private DS1350 ds1350;
我最初想念的另一点是您正在使用
@GeneratedValue(strategy=IDENTITY)
引用documentation:
“表明持久性提供者必须使用数据库标识列为实体分配主键。”
如果您在创建链接时没有手动分配想法,则ID将不会保留。使用@GeneratedValue(strategy = AUTO)将告诉数据库它需要为您的子类(DS1350)生成ID。这是一个修复程序,但可能不是您想要的。
另外,根据您的更新,您在连接列中引用了错误的外键,并且从ds1350到申请人的关联看起来很可疑,请尝试以下操作:
//in applicant
@OneToOne(cascade = CascadeType.ALL)
@Fetch(value = FetchMode.SELECT)
@JoinColumn(name = "ds1350_id", referencedColumnName= "applicant_id")
private DS1350 ds1350;
//in ds1350
@OneToOne(mappedBy="applicant", cascade=CascadeType.ALL)
private Applicant applicant; // Unique id for each applicant
我还没有测试过。