我将使用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();
任何人都可以帮助我
答案 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")