2017-03-06 1 views
0

Wenn ich versuche, die Tabelle zu aktualisieren, wird die obige Ausnahme angezeigt. meine Modellklasse istTransientObjectException: Das angegebene Objekt hat eine Null-ID: 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) 

mein Dao-Klasse [UPDATED one]

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(); 
      }   

     } 

in Kampagnen Variable, die wir alle Daten erhalten, von Kampagne i alle Daten (campaign_structure) Tabelle aktualisieren müssen

+0

Sie haben kein Feld mit @Id Anmerkung –

Antwort

0

Sie versuchen, eine Einheit zu aktualisieren, ohne zu Laden es Kontext vorher persistenece ..

Sie waren ganz in der Nähe, wenn Sie nur uncomment:

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

Außerdem müssen Sie @Id Anmerkung zu campaignId Feld in Ihrem Unternehmen hinzufügen die Persistenz-Provider wissen durch zu lassen, was Feld sollte es für die Entität abfragen.

aktualisieren

Wenn Sie nicht die Einheit Signatur ändern können, dann würden Sie die Bulk-Update-Funktion verwenden. Sie würden so etwas wie:

StringBuilder updateStmt = new StringBuilder(); 
updateStmt.append("update CampaignStructure "); 
updateStmt.append("set accountId = :accountId "); 
updateStmt.append(", budget = :budget"); 
... 
updateStmt.append(" where campaignId = :campaignId"); 

dann eine Abfrage erstellen und die Parameter aktualisieren:

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

schließlich ausführen:

query.executeUpdate(); 

Bulk-Updates/Löschungen das letzte Mittel im allgemeinen und Dies wäre definitiv ein Workaround. Aber wenn Sie die Entitätssignatur nicht ändern können, sind Sie mit dieser Lösung einverstanden, wenn Sie HQL verwenden möchten.

+0

ThankYou für die schnelle respose .. Ich möchte wissen, ist es eine Möglichkeit, Tabelle zu aktualisieren, ohne alle Felder der Entity-Klasse zu ändern –

+0

wenn ich die CampaignStructure campaignStructure unkommentiert = (CampaignStructure) -Sitzung .load (CampaignStructure.class, Long.valueOf (campaigns.getId())); Linie diese Ausnahme tritt auf org.hibernate.ObjectNotFoundException: Keine Zeile mit dem angegebenen Bezeichner existiert: [com.netelixir.lxr.google.entities.CampaignStructure # 704734966]. –

+0

Sie können also keine @Id Annotation hinzufügen? –

Verwandte Themen