2016-04-04 10 views
0

angegeben. Ich stehe vor einem Problem, während Daten in einer Tabelle persistent sind.verursacht durch: java.sql.SQLException: Der Spaltenname wird mehr als einmal in der SET-Klausel

Fehler:

Verursacht durch: java.sql.SQLException: Der Spaltenname 'SubFundId' angegeben wird mehr als einmal in der SET-Klausel. Einer Spalte kann nicht mehr als ein Wert in derselben SET-Klausel zugewiesen werden. Ändern Sie die SET-Klausel, um sicherzustellen, dass eine Spalte nur einmal aktualisiert wird. Wenn die SET-Klausel Spalten einer Sicht aktualisiert, wird der Spaltenname 'SubFundId' möglicherweise zweimal in der Sichtdefinition angezeigt.

Code Mein Stück Daten für persistierende ist:

@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; 
    } 
    } 

Kartieren mit Teilfonds Tabelle ist wie folgt:

@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

Haben Sie beide wirklich haben wollen SUBFONDS und subFundId Felder ? –

Antwort

2

In Ihrer Klasse, haben Sie zwei Felder, die SubFundId auf der gleichen Spalte zugeordnet sind wie folgt:

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

UND

private long subFundId; 

Also, Hibernate ist nun verwirrt, was Feld muss für subFundId Spalte verwendet werden.

Um dies zu lösen, entweder Sie Feld entfernen long subFundId oder wenn Sie beide dann legen einführbar = false, aktualisierbare = false auf private long subFundId wie folgt:

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

@Madhusuddan: Ich habe versucht, @Column (name = "SubFundId", einfügbar = falsch, aktualisierbar = falsch), aber ich bekomme unter Fehler: Kann den Wert NULL in die Spalte 'SubFundId', Tabelle 'SFSKelvin.dbo nicht einfügen. SC_FundSalesCreditCalcMethod '; Spalte erlaubt keine Nullen. INSERT schlägt fehl. – shree

+0

@shree Weil Sie das Objekt 'subFund' nicht setzen. Sie müssen es mit der 'fundSalesCreditCalcMethod.setSubFund (..)' Methode einstellen. Sie können es von 'session.load (SubFund.class, dto.getSubFundId());' –

+0

@ madhusuddan; Könnten Sie mir bitte auch sagen ... referredColumnName ist die in der Klasse definierte Variable oder die in der Tabelle definierte Spalte. @JoinColumn (name = "SubFundId", referencedColumnName = "SubFundId") der Referenzspalte ist aus Tabelle @Id Teilfonds \t @GeneratedValue (strategy = GenerationType.IDENTITY) \t @Column (name = "SubFundId") \t Privat lang Ich würde; – shree

0

Sie haben einen Verweis auf einen Teilfonds Einheit erklärt:

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

plus Sie haben auch ein Feld deklariert, das die gleiche Referenz

abbildet

Wählen Sie, welche Sie behalten möchten, wenn Sie die Entitäten gleichzeitig behandeln müssen, behalten Sie die erste, wenn Sie in Ihrer gesamten Anwendung getrennt behandelt werden, können Sie sich einige Probleme ersparen und die zweite behalten.

+0

Es bezieht sich nicht auf die gleiche Spalte..Es ist eine andere Spalte von verschiedenen Tabelle. – shree

Verwandte Themen