Quantcast
Channel: Spring Community Forums - Data
Viewing all articles
Browse latest Browse all 297

Problem with EmbeddedId and ManyToOne

$
0
0
Hi I'm new in spring and I have some problems with a composite key and many to one relation.

My classes are the following.
Code:

@Entity
@Table(name="TEST2_SERVICES")
public class Test2Service implements Serializable {

        /**
        *
        */
        private static final long serialVersionUID = -407995405967173101L;
       
        @EmbeddedId
        private Test2ServiceId testServiceId;
       
        private String description;
       
       
        private @Valid SbService sbServices;

        @Column(name="DESCRIPTION")
        public String getDescription() {
                return description;
        }

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

        @ManyToOne(cascade=CascadeType.MERGE)
        @JoinColumn(name="SERVICE_ID")
        public SbService getSbServices() {
                return sbServices;
        }

        public void setSbServices(SbService sbServices) {
                this.sbServices = sbServices;
        }

}

With the embedded Id class:

Code:

@Embeddable
public class Test2ServiceId implements Serializable {

        /**
        *
        */
        private static final long serialVersionUID = 6572282224706486208L;

       
        private String ip;
       
       
        private Integer port;

       
       
        public Test2ServiceId() {

        }
       
        @Column(name="IP")
        @NotNull
        @Size(min=1, max=20)
        public String getIp() {
                return ip;
        }

        public void setIp(String ip) {
                this.ip = ip;
        }

        @Column(name="PORT")
        @NotNull
        public Integer getPort() {
                return port;
        }

        public void setPort(Integer port) {
                this.port = port;
        }

        @Override
        public int hashCode() {
                return this.ip.hashCode() + this.port;
        }

        @Override
        public boolean equals(Object obj) {
                if(obj instanceof Test2ServiceId){
                        Test2ServiceId sbTicketServiceServiceId = (Test2ServiceId) obj;
                        return sbTicketServiceServiceId.port == this.port && sbTicketServiceServiceId.ip.equals(this.ip);
                }
                return false;
        }
}

And the other side of the relation is:

Code:

@Entity
@Table(name="SERVICES")
public class SbService implements Serializable {

        /**
        *
        */
        private static final long serialVersionUID = 3848055773985685841L;

        private String id;
       
        private String description;
       
        private SbServiceType sbServiceType;
       
        private Set<Test2Service> test2Services = new HashSet<Test2Service>();
       
        @Id
        @Column(name="SERVICE_ID")
        @NotNull
        @Size(min=2, max=6)
        public String getId() {
                return id;
        }

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


        @Column(name="DESCRIPTION")
        @Size(max=100)
        public String getDescription() {
                return description;
        }

        public void setDescription(String description) {
                this.description = description;
        }
       
        @ManyToOne
        @JoinColumn(name="SERVICE_TYPE_ID")
        public SbServiceType getSbServiceType() {
                return sbServiceType;
        }

        public void setSbServiceType(SbServiceType sbServiceType) {
                this.sbServiceType = sbServiceType;
        }

       
        @OneToMany(mappedBy="sbServices", cascade=CascadeType.MERGE)
        public Set<Test2Service> getTest2Services() {
                return test2Services;
        }

        public void setTest2Services(Set<Test2Service> test2Services) {
                this.test2Services = test2Services;
        }

        @Override
        public String toString() {
                return "Id: " + this.getId() + ", tipo: " + this.getSbServiceType().getType() + ", Desc:  " + this.getDescription();
        }
       
        @Transient
        public String getSelectString(){
                return this.getId() + " " + this.getDescription();
        }

}

I create a repository interface that extends from

Code:

public interface Test2ServiceRepository extends PagingAndSortingRepository<Test2Service, Test2ServiceId>{
}


The repository is scanned when the application start with the following
Code:

<jpa:repositories base-package="com.testing.repository"  entity-manager-factory-ref="emf" transaction-manager-ref="transactionManager"/>
Now I can use that interface with the @Autowired. But my problem presents when I do this.test2ServiceRepository.findAll()

The following error presents:

Quote:

org.springframework.web.util.NestedServletExceptio n: Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceU sageException: could not execute query; SQL [select test2servi0_.ip as ip8_, test2servi0_.port as port8_, test2servi0_.description as descript3_8_, test2servi0_.sbServices as sbServices8_ from TEST2_SERVICES test2servi0_]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query
I have done some testing without the many to one relation and is working fine. But adding that it breaks the findall

Any help will be welcome!

Regards

Viewing all articles
Browse latest Browse all 297

Trending Articles