在使用save方法進行添加操作時,由於某些情況下數據是直接從前端得到,所以,該主鍵實體對象的id為null(Integer或者Long類型),此時其對應的外聯實體對象可能直接保存在該實體類對象中,就像買一把玩具手槍會帶一包槍子一樣,不是從庫中獲取的。此時外聯對象中的外鍵也為null,所以在調用save方法時,外聯對象進行添加時會出現為外鍵null的情況,如果設置了外鍵不為null就會報錯,解決的一個方法是:將外鍵字段設為可以為null,在主鍵實體對象調用save方法后獲取該主鍵實體對象的所有外鍵實體對象,遍歷所有對象,將其對應的屬性設置為主鍵實體對象(一定要在主鍵實體對象調用了save方法之后,此時主鍵實體對象中的id屬性就被賦值了),然后逐個調用save方法進行update。
主鍵類:
1 @Entity 2 @Table(name = "CPAQXPG") 3 @SequenceGenerator(name = "TES_TONE_SEQ", sequenceName = "TEST_ONE_SEQ") 4 public class TestOneEntity implements Serializable { 5 6 @Id 7 @Column(name = "ID") 8 //@GenericGenerator(name = "TEST_ONE_SEQ", strategy = "increment") 9 @GeneratedValue(strategy = GenerationType.AUTO, generator = "TEST_ONE_SEQ") 10 private Integer id; 11 12 @Column(name = "CREATE_BY") 13 private String createBy; 14 15 @OneToMany(targetEntity = TestTwoEntity.class,cascade = CascadeType.ALL,mappedBy = "testOne") 17 private List<TestTwoEntity> testTwos = new ArrayList<>(); 18 19 }
外鍵類:
1 @Entity 2 @Table(name = "TEST_TWO_PHASE") 3 @SequenceGenerator(name = "TEST_TWO_SEQ", sequenceName = "TEST_TWO_SEQ") 4 public class TestTwoEntity implements Serializable{ 5 6 @Id 7 @Column(name = "ID") 8 @GeneratedValue(strategy = GenerationType.AUTO, generator = "TEST_TWO_SEQ") 9 private Integer id; 10 11 @Column(name = "STORAGE_TEMP") 12 private String storageTemp; 13 14 //STORAGE_TIME與數據庫關鍵字重復,所以加_SUB來區分 15 @Column(name = "STORAGE_TIME_SUB") 16 private String storageTime; 17 18 //與TestOneEntity建立映射關系,id為TestOneEntity中的id屬性 19 @ManyToOne(targetEntity = TestOneEntity.class,fetch = FetchType.EAGER) 20 @JoinColumn(name = "C_ID") 21 private TestOneEntity testOne; 22 23 }
Dao層:
1 @Repository 2 public class TestOneDao extends HibernateDao< TestOneEntity,Integer> { 3 4 }
Service層:
1 @Service 2 @Transactional 3 public class TestOneService extends BaseService<TestOneEntity,Integer> { 4 @Autowired 5 private TestOneDao testOneDao; 6 7 @Override 8 public HibernateDao<TestOneEntity, Integer> getEntityDao() { 9 return testOneDao; 10 } 11 12 }
控制層方法:
1 @Service 2 @Transactional 3 public class TestOneService extends BaseService<TesetOneEntity,Integer> { 4 @Autowired 5 private TestOneDao testOneDao; 6 7 public String addTestOne(HttpServletRequest request,TestOneEntity testOneEntity) { 8 9 testOneService.save(testOneEntity); 10 List<TestTwoEntity> testTwos = testOneEntity.getTestTwos();
12 for (TestTwoEntity testTwo : testTwos) { 13 testTwo.setTestOne(testOneEntity); 14 testTwoService.save(testTwo);
16 }
// 或者遍歷將OneEntity實例set之后,使用批量插入 17 18 } 19 20 }