2017-03-06 41 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注释? –

相关问题