Spring MVC Hibernate OneToMany非主键连接列无法强制转换为可序列化错误

时间:2018-04-19 10:22:21

标签: hibernate spring-mvc spring-restcontroller

我将使用Hibernate,JPA,MapStruct ...

创建一个Spring Restful API

我必须使用主表:

 live_data (id, room_name, occupation,last_change,uuid)

rooms (id, name)

我的目标是创建一个返回所有房间及其实时数据信息的服务,但我需要按名称而不是id加入这两个表。

我创建了2个实体:

@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;

}

@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();
    }

}

我也在我的Spring服务中使用maptruct来调用room.getSensorData();

我的问题是,如果我试图让我的房间出错,我有一个错误:

java.lang.ClassCastException: com.project.domain.room.model.Room cannot be cast to java.io.Serializable

如果我让它实现Serializable,我得到:

NoSuchMethodError on getSensorData();

任何人都可以帮助我

1 个答案:

答案 0 :(得分:0)

你是关系OneToMany和ManyToOne的混合方向。

试试这个: 在Room类中,将OneToMany更改为:

@OneToMany(cascade= CascadeType.ALL, fetch=FetchType.LAZY, mappedBy = "roomName")

删除JoinColumn注释:

@JoinColumn(name="room_name", referencedColumnName = "name", insertable=false, updatable=false)

通过Room class中的sensorData

在SensorData类中,在roomName字段上添加以下行:

@ManyToOne
@JoinColumn(name = "room_name", referencedColumnName = "name")