Kaci Hyou
Kaci Hyou

Reputation: 75

Spring MVC Hibernate OneToMany non Primary key join column cannot be cast to serializable error

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

Answers (1)

Adam Lesiak
Adam Lesiak

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

Related Questions