You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@servicemix.apache.org by acostela <ac...@gmail.com> on 2014/06/09 16:43:49 UTC

@JoinColumn with compositePK and multiinheritance.

I've searched a lot around internet and I didn't find any solution to my
problem. Any help will be so appreciated.

I'm using Servicemix 4.5.3 and I have all my dependencies installed (other
operations are running perfectly).I'm getting this exception with OpenJPA

application.persistence.entities.serviceregistry.Service.interfaces" defines
a target of "userId" for join column "userId", but that target does not
exist in table "Service"

I have the following entities.

@Entity
public class Service {

private ServicePK                    compositePrimaryKey;
private String                       wsdlFile;
private Collection<ServiceInterface> interfaces = new
HashSet<ServiceInterface>();

@EmbeddedId
public ServicePK getCompositePrimaryKey() {
    return compositePrimaryKey;
}
...setters and getters

@ManyToMany
@JoinTable(name = "SERVICE_IMPLEMENTATION", joinColumns = {
        @JoinColumn(name = "tenantId", referencedColumnName = "tenantId"),
        @JoinColumn(name = "userId", referencedColumnName = "userId"),
        @JoinColumn(name = "serviceName", referencedColumnName =
"serviceName") }, inverseJoinColumns = {
        @JoinColumn(name = "interfaceName", referencedColumnName =
"interfaceName"),
        @JoinColumn(name = "XMLNamespace", referencedColumnName =
"XMLNamespace") })
public Collection<ServiceInterface> getInterfaces() {
    return interfaces;
}

ServicePK is another class to construct my composite primarykey is as
follow.

@Embeddable
public class ServicePK extends TenantUserOwnedEntityPK {

private String            serviceName;

public ServicePK() {}

public ServicePK(String tenantId, String userId, String serviceName) {
    super(tenantId, userId);
    this.serviceName = serviceName;
}

public String getServiceName() {
    return serviceName;
}

public void setServiceName(String serviceName) {
    this.serviceName = serviceName;
}

@Override
public boolean equals(Object obj) {
    if (super.equals(obj) && obj instanceof ServicePK) {
        ServicePK pk = (ServicePK) obj;
        return this.serviceName.equals(pk.serviceName);
    } else {
        return false;
    }
}

@Override
public int hashCode() {
    return super.hashCode() + this.serviceName.hashCode();
}

Finally this PK has a super class to get another field for the composite
key.

@Embeddable
@MappedSuperclass
public class TenantUserOwnedEntityPK extends TenantOwnedEntityPK {

private String            userId;

public TenantUserOwnedEntityPK() {}

public TenantUserOwnedEntityPK(String tenantId, String userId) {
    super(tenantId);
    this.userId = userId;
}

public String getUserId() {
    return userId;
}

public void setUserId(String userId) {
    this.userId = userId;
}

@Override
public boolean equals(Object obj) {
    if (super.equals(obj) && obj instanceof TenantUserOwnedEntityPK) {
        TenantUserOwnedEntityPK pk = (TenantUserOwnedEntityPK) obj;
        return this.userId.equals(pk.userId);
    } else {
        return false;
    }
}

@Override
public int hashCode() {
    return super.hashCode() + this.userId.hashCode();
}

}

As you can see in this last class it's our field userId (The one that the
@ManyToMany relation complains about). When my DB is constructed from my
entities the Service table is as follow.

          Table "public.service"
   Column    |          Type          | Modifiers
-------------+------------------------+-----------
 tenantid    | character varying(255) | not null
 userid      | character varying(255) | not null
 servicename | character varying(255) | not null
 wsdlfile    | text                   |
Indexes:
    "service_pkey" PRIMARY KEY, btree (tenantid, userid, servicename)
Referenced by:
    TABLE "service_implementation" CONSTRAINT
"service_implementation_tenantid_fkey"
   FOREIGN KEY (tenantid, userid, servicename)    
REFERENCES service(tenantid, userid, servicename) DEFERRABLE

BTW I'm using Postgres 9.3.11 and openJPA 2.2.0.

How can I use that userId for a joincolumn in my relations? I have this kind
of mapping in other places and I'm getting the same error.

Thank you very much for everything. 



--
View this message in context: http://servicemix.396122.n5.nabble.com/JoinColumn-with-compositePK-and-multiinheritance-tp5720766.html
Sent from the ServiceMix - User mailing list archive at Nabble.com.