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.
With the embedded Id class: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; } }
And the other side of the relation is: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; } }
I create a repository interface that extends fromCode:@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(); } }
Code:public interface Test2ServiceRepository extends PagingAndSortingRepository<Test2Service, Test2ServiceId>{ }
The repository is scanned when the application start with the following
Now I can use that interface with the @Autowired. But my problem presents when I do this.test2ServiceRepository.findAll()Code:<jpa:repositories base-package="com.testing.repository" entity-manager-factory-ref="emf" transaction-manager-ref="transactionManager"/>
The following error presents:
I have done some testing without the many to one relation and is working fine. But adding that it breaks the findallorg.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
Any help will be welcome!
Regards


Reply With Quote
