I have a VF page where the user is to upload a file and a custom controller to save this to the notes and attachments section of the object record.

I'm receiving the following error when hitting the save button on my VF page:

Insert failed. First exception on row 0 with id a014W00000xc8aOQAQ; first error: INVALID_FIELD_FOR_INSERT_UPDATE, cannot specify Id in an insert call: [Id]
Error is in expression '{!saveScholarship}' in component <apex:commandButton> in page testpage: Class.regularController.saveScholarship: line 14, column 1

Records save successfully when not attaching a document.

Here is my code:

Custom controller

public with sharing class regularController {
    public Scholarship_Award__c sch {get;set;}
    public Recipient__c rec {get;set;}
    public regularController(){
    sch = new Scholarship_Award__c();
    rec = new Recipient__c();
    public void saveScholarship(){
    insert rec;
    sch.Recipient__c = rec.Id;  
    insert sch;

Controller extension for document upload

public with sharing class testController{
    public testController(regularController ctrlParam){
       public Recipient__c myCustomObject;
    private Attachment myDocument;
    public Attachment myDoc
                myDocument = new Attachment();
            return myDocument;
    public testController(ApexPages.StandardController controller)
        myCustomObject = (Recipient__c) controller.getRecord();
    public PageReference upload()
        myDoc.parentId = myCustomObject.Id;
        insert myDoc;
        return null;

VF Page

<apex:page controller="regularController" extensions="testController" lightningStylesheets="true">
    <apex:pageBlock >
        <!--Recipient form-->
    <apex:pageBlockSection title="Add recipients" columns="2">
        <apex:inputField value="{!rec.Name}"/>
        <apex:inputField value="{!rec.Last_Name__c}"/>
        <apex:inputField value="{!rec.Preferred_Name__c}"/>
        <apex:inputField value="{!rec.Email__c}"/>
        <apex:inputField value="{!sch.Award__c}"/>
        <apex:inputField value="{!sch.School__c}"/>
        <apex:inputField value="{!rec.School__c}" rendered="false"/>
        <apex:inputField value="{!sch.Year__c}"/>
        <apex:inputField value="{!rec.Specialty__c}"/>
        <apex:pageBlockSection title="Biography">
        <apex:outputLabel >Upload or enter student biography/CV</apex:outputLabel>
        <apex:inputFile id="myFile" value="{!myDoc.Body}" fileName="{!myDoc.Name}">
            <apex:inputTextarea value="{!rec.Biography__c}" rows="3" cols="100"/>
    <!--Record list-->     
    <!--Submit all records in record list-->
    <apex:pageBlockButtons location="bottom">
        <apex:commandButton action="{!saveScholarship}" value="Submit"/>

Thank you all for your help.


If somebody clicks the upload button twice, you wouldn't have gone through the constructor twice. That causes you to try and insert a record that was already inserted.

Change your insert statements to upsert statements in saveScolarship to avoid the problem. That way, the second (and subsequent) clicks won't create new records.

PS: Not sure why you're using an extension with a custom controller. It's significantly easier and straightforward to simply extend your custom controller. Extensions are useful when using a standard controller, which you're not using.

  • Thank you. It now saves with no error. However, the document does not save to the notes and attachments related list in recipient__c - how can I direct documents to save to that related list? Sep 29 '20 at 21:25
  • I don’t see you calling your upload method anywhere. Sep 30 '20 at 3:42
  • You're right. How can I combine this method with the saveScholarship() method in my main controller? Oct 2 '20 at 14:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.