2016-04-04 77 views
0

我在將數據保留到表時遇到了以下問題。原因:java.sql.SQLException:列名在SET子句中多次指定

錯誤:

產生的原因:值java.sql.SQLException:列名 'SubFundId' 被指定比SET子句中的一次。在同一個SET子句中,列不能分配多個值。修改SET子句以確保列只更新一次。如果SET子句更新視圖的列,那麼列名'SubFundId'可能在視圖定義中出現兩次。

我對持久化數據的代碼段是:

@Transactional 
      public FundSalesCreditCalcMethodDTO addNewSubFundCalculationMethod(FundSalesCreditCalcMethodDTO dto) { 
       try{ 
        @SuppressWarnings("unchecked") 
        List<Object> id = entityManager.createNamedQuery("findSelectedSubFund").setParameter("subFundId",dto.getSubFundId()).getResultList(); 
        System.out.println("*********in addNewSubFundCalculationMethod " +id.toString()); 
        if (id.isEmpty()){ 
         System.out.println("*********in addNewSubFundCalculationMethod: List is empty"); 
         FundSalesCreditCalcMethod fundSalesCreditCalcMethod = new FundSalesCreditCalcMethod(); 
    fundSalesCreditCalcMethod.setSubFundId(dto.getSubFundId()); 

        fundSalesCreditCalcMethod.setEffectiveFromDate(dto.getEffectiveFromDate()); 
        fundSalesCreditCalcMethod.setEffectiveToDate(dto.getEffectiveToDate()); 
    fundSalesCreditCalcMethod.setCreatedBy(dto.getCreatedBy()); 
        fundSalesCreditCalcMethod.setCreatedOn(dto.getCreatedOn()); 
        fundSalesCreditCalcMethod.setLastUpdatedBy(dto.getLastUpdatedBy()); 
        fundSalesCreditCalcMethod.setLastUpdatedOn(dto.getLastUpdatedOn()); 

        fundSalesCreditCalcMethod.setSalesCreditCalcMethodId(1); 
        fundSalesCreditCalcMethod.setPaymentFrequencyId(1); 
        Date date = new Date(); 
        fundSalesCreditCalcMethod.setFirstPaymentDate(date); 
this.entityManager.persist(fundSalesCreditCalcMethod); 

      } 
     } 
     catch(NoResultException exception){ 

     } 

     this.entityManager.flush(); 
     return dto; 
    } 
    } 

測繪與SubFund表是如下:

@ManyToOne(fetch=FetchType.EAGER) 
    @JoinColumn(name="SubFundId", referencedColumnName = "SubFundId") 
    private SubFund subFund; 


    private long salesCreditCalcMethodId; 
    private long subFundId; 
    private Date effectiveFromDate; 
    private Date effectiveToDate; 
    private long paymentFrequencyId; 
    private Date firstPaymentDate; 
    private Date createdOn; 
    private Date lastUpdatedOn; 
    private String createdBy; 
    private String lastUpdatedBy; 


Can anyone please help what is the issue.I have been struggling with it from morning. 
+0

你真的想同時擁有subFund和subFundId領域? –

回答

2

在你的類,你必須映射到下同列SubFundId兩個領域:

@ManyToOne(fetch=FetchType.EAGER) 
@JoinColumn(name="SubFundId", referencedColumnName = "SubFundId") 
private SubFund subFund; 

private long subFundId; 

所以,Hibernate是哪個領域需要現在迷茫用於subFundId列。

爲了解決這個問題要麼你刪除場long subFundId或者如果你既需要再放置插入=假,可更新=假如下的private long subFundId

@Column(name="SubFundId", insertable = false, updatable = false) 
+0

@Madhusuddan:我試着添加@Column(name =「SubFundId」,insertable = false,updatable = false)但是我得到錯誤:無法將NULL值插入列 'SubFundId',表'SFSKelvin.dbo。 SC_FundSalesCreditCalcMethod「;列不允許有空值。 INSERT失敗。 – shree

+0

@shree因爲你沒有設置'subFund'對象。您需要使用'fundSalesCreditCalcMethod.setSubFund(..)'方法進行設置。你可以從'session.load(SubFund.class,dto.getSubFundId());' –

+0

@madhusuddan;你能否也請告訴我... referencedColumnName是在類中定義的變量或表中定義的列。 @JoinColumn(名稱= 「SubFundId」,referencedColumnName = 「SubFundId」)參考列是從SubFund表@Id \t @GeneratedValue(策略= GenerationType.IDENTITY) \t @Column(名稱= 「SubFundId」) \t私人長ID; – shree

0

你已經宣佈到SubFund實體的引用:

@ManyToOne(fetch=FetchType.EAGER) 
@JoinColumn(name="SubFundId", referencedColumnName = "SubFundId") 
private SubFund subFund; 

加上你還宣佈了一個地圖相同的參考

private long subFundId; 

選擇你想保留哪一個,如果你需要同時處理實體保持第一個,如果在你所有的應用程序中他們分開處理,你可以節省自己的一些麻煩,並保持第二。

+0

它不是參考同一列。它是來自不同表格的不同列。 – shree

相關問題