我班上有一个元素集合:
public class InstancePdo implements Comparable<InstancePdo> {
@Id
@Column(name = COLUMN_NAME_ID, columnDefinition = "UUID")
private UUID id;
@Id
@Column(name = COLUMN_NAME_VERSION, columnDefinition = "int")
private int version = -1;
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "settings", joinColumns = {
@JoinColumn(name = COLUMN_NAME_ID, referencedColumnName = COLUMN_NAME_ID, nullable = false, updatable = true),
@JoinColumn(name = "COLUMN_NAME_VERSION", referencedColumnName = COLUMN_NAME_VERSION, nullable = false, updatable = true) })
private Set<SettingPdo> settings;
}
现在,设置如下:
@Embeddable
@Table(
name = "settings",
uniqueConstraints = @UniqueConstraint(
columnNames = { "id", "version", "key", "type" }))
public class SettingPdo implements Comparable<SettingPdo> {
@Column(name = "type", nullable = false)
private String type;
@Column(name = "key", nullable = false)
private String key;
@Column(name = "value", columnDefinition = "CLOB NOT NULL", )
@Lob
@Convert(converter = JsonNodeStringConverter.class)
private String value;
}
现在,如果我用一个Merge操作替换一个instancePDO,就会生成一个删除语句,如下所示:
Error Code: 932
Call: DELETE FROM settings WHERE ((((((key = ?)) AND (type = ?)) AND (value = ?)) AND (id = ?)) AND (version = ?))
bind => [4 parameters bound]
现在,问题是Oracle不接受CLOB(或任何其他LOB)列上的WHERE子句。我把所有类似的线程都读取了所有堆栈溢出,如下所示:https://stackoverflow.com/a/33833399/1549977
如果使用Set并使元素Column不为null,则 hibernate将使用join列和元素创建主键 列。
如您所见,Eclipselink仍会生成包含CLOB字段比较的删除语句。
等于的Hashcode也是正确的。
我不知道下一步该做什么。我的课程(或数据库)有什么问题?由于我遇到了Oracle,如何强制JPA不在delete语句中包含某些特定的列?
提前致谢!