Reputation: 75
I am to create a Spring Restful API using Hibernate, JPA, MapStruct...
I have to main tables :
live_data (id, room_name, occupation,last_change,uuid)
and
rooms (id, name)
My goal is to create a Service that returns all rooms and their live data information but I need to join the two tables by name and not by id.
I created 2 entities :
@Data
@Entity
@Table( name ="live_data")
public class SensorData {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "LiveData_Generator")
@SequenceGenerator(name="LiveData_Generator", sequenceName = "LiveData_Sequence")
@JsonIgnore
private Long id;
@Column(name="room_name", insertable = false, updatable = false)
private String roomName;
@Column(name="uuid") @JsonIgnore
private String sensor_id;
@Column(name="occupation")
private String occupation;
@Column(name="last_change")
private long occupationLastStatusChange;
}
and
@Data
@Entity
@Table(name = "rooms")
public class Room extends AbstractEntityWithNameTitleLocation {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "Room_Generator")
@SequenceGenerator(name="Room_Generator", sequenceName = "Room_Sequence")
private Long id;
private String name;
@OneToMany(cascade= CascadeType.ALL, fetch=FetchType.LAZY)
@JoinColumn(name="room_name", referencedColumnName = "name", insertable=false, updatable=false)
private List<SensorData> sensorData = new ArrayList<>();
}
public class RoomRESP extends Room {
@Override @RestResource(exported = false)
public List<SensorData> getSensorData() {
return super.getSensorData();
}
}
I am also using mapping in my Spring service with mapstruct that calls room.getSensorData();
My problem is that if I try to get my rooms I have an Error :
java.lang.ClassCastException: com.project.domain.room.model.Room cannot be cast to java.io.Serializable
And if I make it implement Serializable I get :
NoSuchMethodError on getSensorData();
Can ANy one help me please
Upvotes: 1
Views: 1170
Reputation: 501
You are mixed directions of relations OneToMany and ManyToOne.
Try this: In Room class change OneToMany to:
@OneToMany(cascade= CascadeType.ALL, fetch=FetchType.LAZY, mappedBy = "roomName")
Remove the JoinColumn annotation:
@JoinColumn(name="room_name", referencedColumnName = "name", insertable=false, updatable=false)
over the sensorData in Room class
In SensorData class add folowing line over the roomName field:
@ManyToOne
@JoinColumn(name = "room_name", referencedColumnName = "name")
Upvotes: 1