【发布时间】:2020-06-06 00:15:29
【问题描述】:
我的表结构如下:
- 每个聊天机器人可以有多个版本。
- 每个版本都可以部署到环境中。
- 版本具有双主键,其中一个是从 chat_bot 表中引用的。
- 环境表只有主键。其中两个是从版本表中引用的。
我有以下类结构:
@Entity
@AllArgsConstructor
@Table(name = "chat_bot")
@NoArgsConstructor
public class Bot {
@Id
private String id;
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(mappedBy = "botId", cascade = CascadeType.ALL, orphanRemoval = true)
private Set<BotVersion> versions = new LinkedHashSet<>();
}
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public class BotVersionPK implements Serializable {
private String botId;
private int version;
}
@Entity
@AllArgsConstructor
@Table(name = "chat_bot_version")
@NoArgsConstructor
@IdClass(BotVersionPK.class)
public class BotVersion {
@Id
private String botId;
@Id
private int version;
@Type(type = "text")
private String json;
@OneToMany(fetch = FetchType.LAZY, orphanRemoval = true)
@JoinColumns({
@JoinColumn(name = "botId", referencedColumnName = "botId"),
@JoinColumn(name = "version", referencedColumnName = "version")
})
private Set<BotEnvironments> environments = new LinkedHashSet<>();
}
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public class BotEnvironmentsPK implements Serializable {
private String botId;
private int version;
private String environmentCode;
}
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "chat_bot_environments")
@IdClass(BotEnvironmentsPK.class)
public class BotEnvironments {
@Id
private String botId;
@Id
private int version;
@Id
private String environmentCode;
}
我使用 JpaRepository 来加载和保存信息。
问题: 如果我从“环境”集中删除一个项目并将其持久化,Hibernate 不会触发 DELETE 操作,而是触发 UPDATE 操作:
update chat_bot_environments set bot_id=null, version=null where bot_id=? and version=?
我得到以下错误,这是有效的:
Column 'bot_id' cannot be null
为什么 Hibernate JPA 触发器更新而不是 DELETE?如何删除通过非空 PK 连接的子元素?
【问题讨论】:
-
你没有错过 OneToMany 环境中的级联属性吗?
-
结果没有区别。
-
你是如何创建架构的?如果用sql,能否提供脚本?
标签: java sql spring set spring-data