2017-03-06 24 views
0

當我試圖更新表時顯示上述異常。 我的模型類是TransientObjectException:給定對象具有空標識符:com.netelixir.lxr.google.entities.CampaignStructure

@Entity 
@com.googlecode.objectify.annotation.Entity 
@Table(name = "campaign_structure") 
@CsvReport(value = ReportDefinitionReportType.CAMPAIGN_PERFORMANCE_REPORT) 
public class CampaignStructure extends Report implements Serializable{ 

    @Column(name = "CAMPAIGN_ID") 
    @CsvField(value = "Campaign ID", reportField = "CampaignId") 
    private Long campaignId; 

    @Column(name = "CAMPAIGN_NAME", length = 255) 
    @CsvField(value = "Campaign", reportField = "CampaignName") 
    private String campaignName; 

    @Column(name = "CAMPAIGN_STATUS", length = 32) 
    @CsvField(value = "Campaign state", reportField = "CampaignStatus") 
    private String campaignStatus; 

    @Column(name = "BUDGET") 
    @CsvField(value = "Budget", reportField = "Amount") 
    @MoneyField 
    private BigDecimal budget; 

    @Column(name = "BUDGET_ID") 
    @CsvField(value = "Budget ID", reportField = "BudgetId") 
    private Long budgetId; 

    @Lob 
    @Column(name = "LABELS", length = 2048) 
    @CsvField(value = "Labels", reportField = "Labels") 
    private String labels; 
    @Lob 
    @Column(name = "LABEL_IDS", length = 2048) 
    @CsvField(value = "Label IDs", reportField = "LabelIds") 
    private String labelIds; 


    @Column(name = "ADVERTISING_CHANNEL_TYPE", length = 32) 
    @CsvField(value = "Advertising Channel", reportField = "AdvertisingChannelType") 
    protected String advertisingChannelType; 

    @Column(name = "ADVERTISING_CHANNEL_SUBTYPE", length = 32) 
    @CsvField(value = "Advertising Sub Channel", reportField = "AdvertisingChannelSubType") 
    protected String advertisingChannelSubType; 


    @Column(name = "TRACKING_URL_TEMPLATE", length=2048) 
    @CsvField(value = "Tracking template", reportField = "TrackingUrlTemplate") 
    private String trackingUrlTemplate; 

    @Column(name = "URL_CUSTOM_PARAMETERS", length=2048) 
    @CsvField(value = "Custom parameter", reportField = "UrlCustomParameters") 
    private String urlCustomParameters; 

    @Column(name = "START_DATE", length=2048) 
    @CsvField(value = "Start date", reportField = "StartDate") 
    @Temporal(javax.persistence.TemporalType.DATE) 
    private Date startDate; 

    @Column(name = "END_DATE", length=2048) 
    @CsvField(value = "End date", reportField = "EndDate") 
    @Temporal(javax.persistence.TemporalType.DATE) 

我DAO類[增訂一個]

public void updateCampaign(Campaign campaigns,GleServices gleServices){ 
       Session session = sessionFactory.openSession(); 
      Transaction tx = null; 
      try{ 
      session = sessionFactory.openSession(); 
      StringBuilder updateStmt = new StringBuilder(); 
updateStmt.append(" update CampaignStructure "); 
updateStmt.append(" set accountId = :accountId "); 
updateStmt.append(" , budget = :budget "); 
updateStmt.append(" , campaignName= :campaignName "); 
updateStmt.append(", budgetId = :budgetId"); 
updateStmt.append(", campaignStatus = :campaignStatus"); 
updateStmt.append(", startDate = :startDate"); 
updateStmt.append(", endDate = :endDate"); 
updateStmt.append(", trackingUrlTemplate = :trackingUrlTemplate"); 
updateStmt.append(", urlCustomParameters = :urlCustomParameters"); 
updateStmt.append(", labels = :labels"); 
updateStmt.append(" where campaignId = :campaignId"); 
Query query = session.createQuery(updateStmt.toString()); 
query.setParameter("accountId", gleServices.getAccountDetails().getSeAccountId()); 
query.setParameter("budget", BigDecimal.valueOf((campaigns.getBudget().getAmount().getMicroAmount()))); 
query.setParameter("campaignId", campaigns.getId()); 
query.setParameter("campaignName", campaigns.getName()); 
query.setParameter("budgetId", campaigns.getBudget().getBudgetId()); 
query.setParameter("campaignStatus", campaigns.getStatus()); 
query.setParameter("startDate", campaigns.getStartDate()); 
query.setParameter("endDate", campaigns.getEndDate()); 
query.setParameter("trackingUrlTemplate", campaigns.getTrackingUrlTemplate()); 
if(campaigns.getUrlCustomParameters() != null){ 
         query.setParameter("urlCustomParameters",getUrlCustomParams(campaigns.getUrlCustomParameters().getParameters())); 
        }else{ 
         query.setParameter("urlCustomParameters",null);  
        } 
if(campaigns.getLabels()!=null){ 
//  campaignStructure.setLabels(campaigns.getLabels().toString()); 
     query.setParameter("labels", campaigns.getLabels().toString()); 
     } 
     else 
     query.setParameter("labels", null); 
query.executeUpdate(); 
      }catch (HibernateException e) { 
      if (tx!=null) tx.rollback(); 
      e.printStackTrace(); 
      }finally { 
      session.close(); 
      }   

     } 

戰役變量,我們得到的所有數據,從營銷活動我需要更新的所有數據(campaign_structure)表

+0

您有@Id註釋 –

回答

0

你正在努力,而無需加載它persistenece事先上下文來更新實體..

你是相當接近,如果你只是取消註釋:

CampaignStructure campaignStructure = 
    (CampaignStructure) session.load(CampaignStructure.class, Long.valueOf(campaigns.getId())); 

此外,您將需要添加@Id註釋campaignId場在你的實體,讓持久性提供認識的應該查詢哪些領域的實體。

更新

如果你不能改變實體的簽名,那麼你就必須使用批量更新功能。你會做這樣的事情:

​​

然後創建一個查詢和更新的參數:

Query query = session.createQuery(updateStmt.toString()); 
query.setParameter("accountId", accountId); 
query.setParameter("budget", budget); 
... 
query.setParameter("campaignId", campaignId); 

最後執行:

query.executeUpdate(); 

批量更新/刪除是一般最後的手段這肯定是一種解決方法..但是如果你不能改變實體簽名,你可以使用這個解決方案,如果你想使用HQL。

+0

三江源快速respose沒有現場..我想知道有沒有辦法在不改變實體類 –

+0

的任何字段時我註釋掉的CampaignStructure campaignStructure = (CampaignStructure)會話更新表.load(CampaignStructure.class,Long.valueOf(campaigns.getId()));發生此異常時發生org.hibernate.ObjectNotFoundException:不存在具有給定標識符的行:[com.netelixir.lxr.google.entities.CampaignStructure#704734966]。 –

+0

所以你不能添加@Id註釋? –

相關問題