openjpa-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Albert Lee <allee8...@gmail.com>
Subject Re: Composite Primary Key with constraints
Date Fri, 31 Jan 2014 14:57:02 GMT
Is there a reason why you have a @ManyToOne relationship in

public class GeoAssociationPK implements Serializable {
    private Geo fromGeo;
    private Geo toGeo;

    @ManyToOne(optional = false)   <<<<<<
    public Geo getFromGeo() {
        return fromGeo;
    }

    @ManyToOne(optional = false)  <<<<<<
    public Geo getToGeo() {
        return toGeo;
    }


On Thu, Jan 30, 2014 at 10:41 PM, Mansour Al Akeel <
mansour.alakeel@gmail.com> wrote:

> Kevin,
>
> Thank you a lot for your time. In fact I fixed the getters and
> setters, and the issue is gone. Now, the issue is with the id field
> being generated in the SQL tables.
> Here's my classes:
>
>
> @Entity
> @Access(AccessType.PROPERTY)
> public class GeoAssoc {
>
>     @EmbeddedId
>     private GeoAssociationPK id = new GeoAssociationPK();
>
>     private GeoAssocType type;
>
>     @ManyToOne(fetch = FetchType.LAZY)
>     @JoinColumn(name = "type")
>     public GeoAssocType getType() {
>         return type;
>     }
>
>     public void setType(GeoAssocType value) {
>         this.type = value;
>     }
>
>     @Column(name = "from_geo_id")
>     public Geo getFromGeo() {
>         return this.id.getFromGeo();
>     }
>
>     public void setFromGeo(Geo fromGeo) {
>         this.id.setFromGeo(fromGeo);
>     }
>
>     @Column(name = "to_geo_id")
>     public Geo getToGeo() {
>         return this.id.getToGeo();
>     }
>
>     public void setToGeo(Geo toGeo) {
>         this.id.setToGeo(toGeo);
>     }
>
>     @Override
>     public boolean equals(Object obj) {
>         throw new UnsupportedOperationException("Not implemented");
>     }
>
>     @Override
>     public int hashCode() {
>         throw new UnsupportedOperationException("Not implemented");
>     }
>
> }
>
>
>
>
> @Embeddable
> public class GeoAssociationPK implements Serializable {
>
>     private Geo fromGeo;
>
>     private Geo toGeo;
>
>
>     @ManyToOne(optional = false)
>     public Geo getFromGeo() {
>         return fromGeo;
>     }
>
>     public void setFromGeo(Geo fromGeo) {
>         this.fromGeo = fromGeo;
>     }
>
>     @ManyToOne(optional = false)
>     public Geo getToGeo() {
>         return toGeo;
>     }
>
>     public void setToGeo(Geo toGeo) {
>         this.toGeo = toGeo;
>     }
>
>     @Override
>     public boolean equals(Object obj) {
>         throw new UnsupportedOperationException("Not implemented");
>     }
>
>     @Override
>     public int hashCode() {
>         throw new UnsupportedOperationException("Not implemented");
>     }
> }
>
>
> The generated table has 4 fields (type, from_geo_id , to_geo_id , and
> id). The last columns "id" is not needed, and don't know how to tell
> the persistence classes to ignore it and not to generate it in the DB.
> This is why I have PROPERTY access type, but still it's generated. Any
> advice about how to do this ??
>
>
> Thank you.
>
> On Thu, Jan 30, 2014 at 9:53 AM, Kevin Sutter <kwsutter@gmail.com> wrote:
> > Hi Mansour,
> > I agree that the message is messed up a bit...  This particular message
> is
> > used in a few different locations in the code.  If you have additional
> > context about when this is received (call stack, persistent operation,
> > etc), it would help with identifying the specific usage and get that
> > cleaned up.
> >
> > Looking at your example, a couple of things jump out...
> >
> > 1)  In your PK class, your getter/setter methods don't match the strId
> > attribute (get/setMessage?).  These names need to follow standard java
> bean
> > conventions and need to match up.
> >
> > 2)  In your GeoAssociation class...  It looks like you want the ability
> to
> > setGeo and setStrId, but I don't see those methods defined.  You have
> them
> > defined (sort of, per my first comment) in your PK class.  But, you don't
> > have them defined in your GeoAssoc class.
> >
> > That's all I've got at this point.
> > Kevin
> >
> >
> > On Wed, Jan 29, 2014 at 11:48 PM, Mansour Al Akeel <
> > mansour.alakeel@gmail.com> wrote:
> >
> >> Hello all,
> >>
> >> I need to create a primary key in my tables, and set constrains on
> >> them. So I have few tables:
> >>
> >> 1- Geo
> >> 2- GeoAssociation
> >>
> >> For the GeoAssociation, I need a primary key GeoAssociationPK. The PK
> >> has a field, that "HAS" to be a geo_id. So here's the definition I
> >> have for GeoAssociation:
> >>
> >>
> >>
> >> @Embeddable
> >> public class GeoAssociationPK implements Serializable {
> >>
> >>     private String strId;
> >>
> >>     private Geo geo;
> >>
> >>     @Column(name = "str_id")
> >>     public String getMessage() {
> >>         return strId;
> >>     }
> >>
> >>     public void setMessage(String message) {
> >>         this.strId = message;
> >>     }
> >>
> >>     @ManyToOne(optional = false)
> >>     @Column(name = "geo_id")
> >>     public Geo getGeo() {
> >>         return geo;
> >>     }
> >>
> >>     public void setGeo(Geo geoFrom) {
> >>         this.geo = geoFrom;
> >>     }
> >>
> >>     @Override
> >>     public boolean equals(Object obj) {
> >>         throw new UnsupportedOperationException("Not implemented");
> >>     }
> >>
> >>     @Override
> >>     public int hashCode() {
> >>         throw new UnsupportedOperationException("Not implemented");
> >>     }
> >>
> >> }
> >>
> >>
> >>
> >> This is how I define the GeoAssociation class:
> >>
> >> @Entity
> >> @Access(AccessType.PROPERTY)
> >>
> >> public class GeoAssoc {
> >>
> >>     @EmbeddedId
> >>     private GeoAssociationPK id = new GeoAssociationPK();
> >>
> >>     private GeoAssocType type;
> >>
> >>     @ManyToOne(fetch = FetchType.LAZY)
> >>     @JoinColumn(name = "type")
> >>     public GeoAssocType getType() {
> >>         return type;
> >>     }
> >>
> >>     public void setType(GeoAssocType value) {
> >>         this.type = value;
> >>     }
> >>
> >>     public Geo getGeoFrom() {
> >>         return this.id.getGeo();
> >>     }
> >>
> >>     @Override
> >>     public boolean equals(Object obj) {
> >>         throw new UnsupportedOperationException("Not implemented");
> >>     }
> >>
> >>     @Override
> >>     public int hashCode() {
> >>         throw new UnsupportedOperationException("Not implemented");
> >>     }
> >>
> >> }
> >>
> >>
> >> The error I am getting when building with maven enhancer is:
> >>
> >> The id class specified by type "class entities.geo.GeoAssoc" does not
> >> match the primary key fields of the class.  Make sure your identity
> >> class has the same primary keys as your persistent type, including pk
> >> field types. Mismatched property: "geo" -> [Help 1]
> >>
> >> I don't understand the error message or how to solve it. What I need
> >> is to be able to create and persist entity without having to
> >> explicitly create the PK.
> >>
> >> For example :
> >> GeoAssociation gs = new GeoAssociation();
> >> gs.setGeo(myGeo);
> >> gs.setStrId(someString);
> >>
> >>
> >> My question is how to achieve this, and resolve this error message ?
> >>
> >>
> >> Thank you in advance.
> >>
>



-- 
Albert Lee.

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message