關於jpa添加一對多數據時外鍵值為空的問題


在使用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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM