我遇到设计不良的数据库模式,我需要加入一个基于复合键的表,其中缺少一个字段(在MySql中有这样的FK,但是Hibernate抱怨它)。
@ManyToOne
@JoinColumnsOrFormulas({
@JoinColumnOrFormula(column=@JoinColumn(name = "par_mascode", referencedColumnName = "mascode", nullable = false, insertable = false, updatable = false)),
@JoinColumnOrFormula(formula=@JoinFormula(value="dynamicVariable", referencedColumnName = "maslang")) })
public Master getMaster() {
return this.master;
}
dynamicVariable
应代表当前用户选择的Locale,它是通过代码获得的(不存在于DB中)。
答案 0 :(得分:0)
因为@Formula
仅支持标准SQL,所以我想出了使用数据库会话变量的解决方法。
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumnsOrFormulas({
@JoinColumnOrFormula(column=@JoinColumn(name = "par_mascode", referencedColumnName = "mascode", nullable = false, insertable = false, updatable = false)),
@JoinColumnOrFormula(formula=@JoinFormula(value="@lang", referencedColumnName = "maslang")) })
public Master getMaster() {
return this.master;
}
//called before getting list of entities
Query nativeQuery = entityManager.createNativeQuery("SET @lang=:lang").setParameter("lang", Utils.getLanguageIdFromContext());
nativeQuery.executeUpdate();