问题在于,第一次将“消息”对象类型添加到“ StoreActivity”实体中,这样做没有任何问题,第二次迭代时,程序抛出异常:同一对象的多个表示形式实体
我已尝试使用所有类型的“级联”的父实体,但它不起作用
实体StoreActivity:
@Entity
@Table(name="store_activities")
public class StoreActivity implements Serializable {
@EmbeddedId
StoreActivityPk storeActivityPk = new StoreActivityPk();
@ManyToOne
@JoinColumn(name = "store_id", insertable = false, updatable = false)
@MapsId("storeId")
private Store store;
@ManyToOne
@JoinColumn(name = "activity_id", insertable = false, updatable = false)
@MapsId("activityId")
private Activity activity;
@NotEmpty
@Column(length = 500, nullable=true)
private String comment;
@OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL,CascadeType.DETACH,CascadeType.PERSIST,CascadeType.REFRESH,CascadeType.REMOVE})
@JoinColumns({
@JoinColumn(name="date_activity", referencedColumnName="dateActivity"),
@JoinColumn(name="store_id", referencedColumnName="store_id"),
@JoinColumn(name="activity_id", referencedColumnName="activity_id"),
@JoinColumn(name="store_activity_hour", referencedColumnName="storeActivityHour")
})
private List<Message> messages;
//Getters and setters ...
}
StoreActivityPk:
@Embeddable
public class StoreActivityPk implements Serializable{
private Long activityId;
private Long storeId;
@Temporal(TemporalType.DATE)
private Date dateActivity;
@Temporal(TemporalType.TIME)
private Date storeActivityHour;
}
消息实体:
@Entity
@Table(name = "messages")
public class Message implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long messageId;
@NotEmpty
@Column(length = 1000, nullable=false)
private String messageContent;
@Column(length = 1, nullable=false)
private Boolean messageRead;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name="user_id")
private UserCheck userCheckSender;
@Temporal(TemporalType.TIMESTAMP)
private Date dateMessage;
//Getters and setters
}
控制器:
public class StoreActivityController {
@PostMapping("/save")
public String save(@Valid Message message, BindingResult result, Model model, RedirectAttributes flash,
SessionStatus sessionStatus, Authentication authentication,
@RequestParam(name = "storeId", required = true) Long storeId,
@RequestParam(name = "activityId", required = true) Long activityId,
@RequestParam(name = "dateActivity", required = true) @DateTimeFormat(pattern="yyyy-MM-dd") Date dateActivity) {
if (result.hasErrors()) {
model.addAttribute("title", "Mensajes");
model.addAttribute("subtitle", "Mensajes de la actividad diaria");
return "frontend/message/activitymessage";
}
UserCheck userCheck = (UserCheck) authentication.getPrincipal();
message.setUserCheckSender(userCheck);
StoreActivity storeActivity = storeActivityService.findById(activityId, storeId, new Date());
storeActivity.addMessage(message);
storeActivityService.saveStoreActivity(storeActivity);
sessionStatus.isComplete();
flash.addFlashAttribute("success", "Mensaje Enviado");
return "redirect:/message/activity/" + storeActivity.getStoreActivityPk().getActivityId() + "/store/"
+ storeActivity.getStoreActivityPk().getStoreId();
}
}
实际结果控制台:
2019-08-08 17:44:54.918 WARN 5024 --- [io-8090-exec-10] .mmaExceptionHandlerExceptionResolver:已解决[org.springframework.dao.InvalidDataAccessApiUsageException:同一实体的多个表示形式[cl。 tricotcorp.app.checklist.models.entity.UserCheck#1]正在合并。分离:[cl.tricotcorp.app.checklist.models.entity.UserCheck@8f06f5d];托管:[cl.tricotcorp.app.checklist.models.entity.UserCheck@46781997];嵌套异常是java.lang.IllegalStateException:合并同一实体[cl.tricotcorp.app.checklist.models.entity.UserCheck#1]的多个表示形式。分离:[cl.tricotcorp.app.checklist.models.entity.UserCheck@8f06f5d];托管:[cl.tricotcorp.app.checklist.models.entity.UserCheck@46781997]]