Mapping Question - OneToMany Create Table from Entity Fails

View: New views
3 Messages — Rating Filter:   Alert me  

Mapping Question - OneToMany Create Table from Entity Fails

by RogerV :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

I've got the following entity definitions (trimmed) below. When I try to generate Tables from Entities I get the error message;

Exception [EclipseLink-48] (Eclipse Persistence Services - 1.1.2.v20090612-r4475): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Multiple writable mappings exist for the field [CCFParameter.id].  Only one may be defined as writable, all others must be specified read-only.
Mapping: org.eclipse.persistence.mappings.OneToOneMapping[ccfgroup]
Descriptor: RelationalDescriptor(com.blackbox.entities.db.CCFParameter --> [DatabaseTable(CCFParameter)])

What do I need to correct this and what does it actually mean?

Regards

@Entity
@Table(name="CCFGroup")
public class CCFGroup {
       

        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        @Column(name="id")
        private int id;
       
       
        //bi-directional many-to-one association to CCFParameter
        @OneToMany(mappedBy="ccfgroup",fetch=FetchType.LAZY, cascade={CascadeType.ALL})
        private Set<CCFParameter> ccfParameters;

    public CCFGroup() {
    }

        public int getId() {
                return this.id;
        }

        public void setId(int id) {
                this.id = id;
        }

       
        public Set<CCFParameter> getCcfParameters() {
                return this.ccfParameters;
        }

        public void setCcfParameters(Set<CCFParameter> ccfParameters) {
                this.ccfParameters = ccfParameters;
        }

}

@Entity
@Table(name="CCFParameter")
public class CCFParameter implements Serializable {
        private static final long serialVersionUID = 1L;

        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        @Column(name="id")
        private int id;

        @Column(name="description", nullable=false, length=128)
        private String description;

        @Column(name="idsDescription", nullable=false, length=128)
        private String idsDescription;

        @Column(name="parameterName", unique=true, nullable=false, length=64)
        private String parameterName;

       
        @ManyToOne (cascade=CascadeType.ALL)
        @JoinColumn(name="id")
        private CCFGroup ccfgroup;
       
        @Version
        @Column(name="version", nullable=false)
        private long version;

        @Column(name="display", nullable=false, length=1)
        private String display;
       
    public CCFParameter() {
    }

        public int getId() {
                return this.id;
        }

        public void setId(int id) {
                this.id = id;
        }

        public CCFGroup getCCFGroup() {
                return ccfgroup;
        }
       
        public void setCCFGroup(CCFGroup ccfgroup) {
                this.ccfgroup = ccfgroup;
        }
       
        public String getDescription() {
                return this.description;
        }

        public void setDescription(String description) {
                this.description = description;
        }

        public String getIdsDescription() {
                return this.idsDescription;
        }

        public void setIdsDescription(String idsDescription) {
                this.idsDescription = idsDescription;
        }

        public String getParameterName() {
                return this.parameterName;
        }

        public void setParameterName(String parameterName) {
                this.parameterName = parameterName;
        }

        public long getVersion() {
                return this.version;
        }

        public void setVersion(long version) {
                this.version = version;
        }

        public String getDisplay() {
                return display;
        }
        public void setDisplay(String display) {
                this.display = display;
        }

Re: Mapping Question - OneToMany Create Table from Entity Fails

by christopher delahunt :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hello,

As the error states, the CCFParameter.id database field is mapped
twice.  Notice that CCFParameter's id and ccfgroup both use the "id"
field - one of them will need to be set as insertable=false
updateable=false.

Best Regards,
Chris

RogerV wrote:

> I've got the following entity definitions (trimmed) below. When I try to
> generate Tables from Entities I get the error message;
>
> Exception [EclipseLink-48] (Eclipse Persistence Services -
> 1.1.2.v20090612-r4475):
> org.eclipse.persistence.exceptions.DescriptorException
> Exception Description: Multiple writable mappings exist for the field
> [CCFParameter.id].  Only one may be defined as writable, all others must be
> specified read-only.
> Mapping: org.eclipse.persistence.mappings.OneToOneMapping[ccfgroup]
> Descriptor: RelationalDescriptor(com.blackbox.entities.db.CCFParameter -->
> [DatabaseTable(CCFParameter)])
>
> What do I need to correct this and what does it actually mean?
>
> Regards
>
> @Entity
> @Table(name="CCFGroup")
> public class CCFGroup {
>
>
> @Id
> @GeneratedValue(strategy=GenerationType.IDENTITY)
> @Column(name="id")
> private int id;
>
>
> //bi-directional many-to-one association to CCFParameter
> @OneToMany(mappedBy="ccfgroup",fetch=FetchType.LAZY,
> cascade={CascadeType.ALL})
> private Set<CCFParameter> ccfParameters;
>
>     public CCFGroup() {
>     }
>
> public int getId() {
> return this.id;
> }
>
> public void setId(int id) {
> this.id = id;
> }
>
>
> public Set<CCFParameter> getCcfParameters() {
> return this.ccfParameters;
> }
>
> public void setCcfParameters(Set<CCFParameter> ccfParameters) {
> this.ccfParameters = ccfParameters;
> }
>
> }
>
> @Entity
> @Table(name="CCFParameter")
> public class CCFParameter implements Serializable {
> private static final long serialVersionUID = 1L;
>
> @Id
> @GeneratedValue(strategy=GenerationType.IDENTITY)
> @Column(name="id")
> private int id;
>
> @Column(name="description", nullable=false, length=128)
> private String description;
>
> @Column(name="idsDescription", nullable=false, length=128)
> private String idsDescription;
>
> @Column(name="parameterName", unique=true, nullable=false, length=64)
> private String parameterName;
>
>
> @ManyToOne (cascade=CascadeType.ALL)
> @JoinColumn(name="id")
> private CCFGroup ccfgroup;
>
> @Version
> @Column(name="version", nullable=false)
> private long version;
>
> @Column(name="display", nullable=false, length=1)
> private String display;
>
>     public CCFParameter() {
>     }
>
> public int getId() {
> return this.id;
> }
>
> public void setId(int id) {
> this.id = id;
> }
>
> public CCFGroup getCCFGroup() {
> return ccfgroup;
> }
>
> public void setCCFGroup(CCFGroup ccfgroup) {
> this.ccfgroup = ccfgroup;
> }
>
> public String getDescription() {
> return this.description;
> }
>
> public void setDescription(String description) {
> this.description = description;
> }
>
> public String getIdsDescription() {
> return this.idsDescription;
> }
>
> public void setIdsDescription(String idsDescription) {
> this.idsDescription = idsDescription;
> }
>
> public String getParameterName() {
> return this.parameterName;
> }
>
> public void setParameterName(String parameterName) {
> this.parameterName = parameterName;
> }
>
> public long getVersion() {
> return this.version;
> }
>
> public void setVersion(long version) {
> this.version = version;
> }
>
> public String getDisplay() {
> return display;
> }
> public void setDisplay(String display) {
> this.display = display;
> }
>
>  
_______________________________________________
eclipselink-users mailing list
eclipselink-users@...
https://dev.eclipse.org/mailman/listinfo/eclipselink-users

Re: Mapping Question - OneToMany Create Table from Entity Fails

by RogerV :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


christopher delahunt wrote:
Hello,

As the error states, the CCFParameter.id database field is mapped
twice.  Notice that CCFParameter's id and ccfgroup both use the "id"
field - one of them will need to be set as insertable=false
updateable=false.

Ah - well that's not what I wanted anyway :(

@Entity
@Table(name="CCFParameter")
public class CCFParameter {

        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        @Column(name="id")
        private int id;

        @ManyToOne (cascade=CascadeType.ALL)
        @JoinColumn(name="id")
        private CCFGroup ccfgroup;

I thought that the @JoinColumn(name="id") referred to the id column in the CCFGroup class/entity, not the id column in the Parameter class/entity. So it looks like I've missed the point in trying to create @OneToMany and @ManyToOne ..... again!

Regards