gpt4 book ai didi

java - 如何删除包含可为空字段的 Hibernate @Embeddables?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:18:04 25 4
gpt4 key购买 nike

删除@Embeddable 对象时,我遇到了一些问题。

我有以下域类:SwitchVoipTrunkGroup 和 PrioritizedCodec。后者包含几个可为空的字段。

class SwitchVoipTrunkGroup {

//...

@CollectionOfElements(fetch = FetchType.LAZY)
@JoinTable(
name = "SWITCH_VOIP_TKG_CODEC",
joinColumns = @JoinColumn(name = "FK_SWITCH_VOIP_TKG_ID")
)
@ForeignKey(name = "FK_CODEC_SWITCH_VOIP_TKG")
private Set<PrioritizedCodec> prioritizedCodecs = new HashSet<PrioritizedCodec>();

//...
}

@Embeddable
public class PrioritizedCodec {

@Column(name = "PRIORITY")
private String priority;

@Column(name = "FAX_MODE")
private String faxMode;

//... some more columns ...
}

当我编辑 SwitchVoipTrunkGroup 的 prioritizedCodecs 字段(例如,通过删除条目)并保存实体时,我在我的 Hibernate 日志记录中看到以下内容:

13:54:31,919 INFO  [STDOUT] Hibernate: delete from T_SWITCH_VOIP_TKG_CODEC where 
fk_switch_voip_tkg_id=? and fax_mode=? and priority=?

来自 this question我理解为什么 Hibernate 使用 where 子句中的所有字段。然而,这会带来问题:如果其中一些字段为空,查询将如下所示:

delete from T_SWITCH_VOIP_TKG_CODEC where fk_switch_voip_tkg_id=1 and fax_mode = '' 
and priority =''

但这不会删除任何记录,因为 Hibernate 真正需要的是检查空字符串的 NULL iso。例如:

delete from T_SWITCH_VOIP_TKG_CODEC where fk_switch_voip_tkg_id=1 and fax_mode
IS NULL and priority IS NULL

(请参阅 here 以了解有关为什么检查空字符串不够的更多信息)

关于如何解决这个问题有什么想法吗?非常感谢!

最佳答案

我建议规范化你的数据库,这样你的两个类都成为实体,然后在 SwitchVoipTrunkGroup 和 PrioritizedCodec 之间设置一对多关系,然后你可以设置级联规则以便 Hibernate 自动更新 PrioritizedCodec 类型的元素集合,当你坚持 SwitchVoipTrungGroup 的实例。

@Entity
class SwitchVoipTrunkGroup {

//...

@OneToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST}, orphanRemoval = true)
@JoinColumn(name = "switchVoipTrunkGroup_id")
@ForeignKey(name = "FK_PrioritizedCodec_SwitchVoipTrunkGroup")
private Set<PrioritizedCodec> prioritizedCodecs = new HashSet<PrioritizedCodec>();

//...
}

@Entity
public class PrioritizedCodec {

@Column(name = "PRIORITY")
private String priority;

@Column(name = "FAX_MODE")
private String faxMode;

//... some more columns ...
}

@Serice("someService")
public class SomeService {

@Autowired
private SwitchVoipTrunkGroupDao trunkDao;

public SwitchVoipTrunkGroup doOperation("criteria") {
SwitchVoipTrunkGroup tg = trunkDao.find("criteroa");
tg.getPrioritizedCodecs().[remove(2)]; //remove should be implemened, that is just lame statement
tg.getPrioritizedCodecs().get(5).setFaxMod("ENABLED");
return trunkDao.save(tg); //hibernate will remove missing elements from PrioritizedCodec table, and will update necessary entities.
}
}

或者,您可以通过@Column 注释的属性为优先级和faxMode 字段指定默认值并强制执行可为空的约束

@Column(columnDefinition = "VARCHAR(20) default 'NONE'", nullable = false)
private String faxMode;

关于java - 如何删除包含可为空字段的 Hibernate @Embeddables?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4246337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com