2013-04-23 170 views
2
@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和申请人类的代码。我使用hibernate session save()来保存ds1350包含在申请人对象中的申请人。我有OneToMany,这是完美的,但这OneToOne不工作。 applicant.getDs1350()抛出一个NullPointerException异常,因为外键(ds1350中的applicant_id)保存为null,而applicantsDao.getApplicantByPrimaryKey(applicantId)无法获取ds1350对象。OneToOne外键保存问题

+0

你可以在你创建'Applicant'和'DS1350'实体的地方发布代码并保存吗? – dcernahoschi 2013-04-23 16:51:26

+0

private void initDS1350(){ \t \t ds1350 = new DS1350(); \t \t \t \t ds1350.setDs1350Number(“ds1350Number”); \t \t ds1350.setCreatedBy(“JUNIT”); \t \t ds1350.setCreatedDate(Calendar.getInstance()); \t \t \t \t \t applicant.setDs1350(ds1350); \t} – 2013-04-23 16:54:22

+0

公共类ApplicantDaoTest { \t @Autowired \t私人ApplicantDao applicantDao; \t \t //域对象 \t private DS1350 ds1350 = new DS1350(); – 2013-04-23 16:54:59

回答

1

摆脱“@Fetch(value = FetchMode.SELECT)”。你告诉它在你的OneToOne注解中急切地获取,但是告诉它用@Fetch注解来获取懒惰。

此外,请确保ds1350字段上的加入列具有引用正确的FK字段(如果申请人中的字段未被称为id)。

@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
@JoinColumn(name = "applicant_id", referencedColumnName= "applicant_id") 
private DS1350 ds1350; 

,我错过了在第一另一点是,你使用

@GeneratedValue(strategy=IDENTITY) 

引述​​3210: “指示的持久性提供者必须使用数据库身份分配为实体主键柱。”

如果您在创建链接时没有手动分配该创意,则该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 

我的天堂”吨测试了这一点。

+0

Applcant和DS1350的字段都被命名为applicant_id,申请人中的PK和DS1350中的FK,我应该在申请人中使用referencedColumnName =“applicantId”作为referencedColumnName =“applicant_id”吗? – 2013-04-23 18:52:38

+0

尝试建议的更改,但没有运气,同样的问题。 DS1350中的外键未保存。 – 2013-04-23 18:56:45

+0

referencedColumnName = “applicant_id” – zmf 2013-04-23 19:02:30