我可以使嵌入的Hibernate实体不可空吗?

dkqlctbz  于 2023-03-30  发布在  其他
关注(0)|答案(5)|浏览(200)

我想要的:

@Embedded(nullable = false)
private Direito direito;

但是,正如您所知,@Embeddable没有这样的属性。
有正确的方法吗?我不需要变通方法。

bweufnob

bweufnob1#

可嵌入的组件(或复合元素,不管你怎么称呼它们)通常包含多个属性,因此被Map到多个列。J2EE规范并没有规定这样或那样的方式。
如果组件的所有属性都为NULL,Hibernate会认为组件为NULL(反之亦然)。因此,您可以声明一个(任何)属性为非空(无论是在@Embeddable中还是作为@Embedded@AttributeOverride的一部分),以实现您想要的效果。
或者,如果你使用Hibernate Validator,你可以用@NotNull注解你的属性,尽管这只会导致应用程序级别的检查,而不是数据库级别的检查。

brc7rcf0

brc7rcf02#

从Hibernate 5.1开始,可以使用“hibernate.create_empty_composites.enabled”来更改此行为(参见https://hibernate.atlassian.net/browse/HHH-7610)。

6fe3ivhb

6fe3ivhb3#

在标记为@Embeddable的类中添加伪字段。

@Formula("0")
private int dummy;

参见https://issues.jboss.org/browse/HIBERNATE-50

whitzsjs

whitzsjs4#

我对前面提出的任何一个建议都不太满意,所以我创建了一个方面来处理这个问题。
这还没有完全测试过,而且绝对没有针对嵌入式对象集合进行过测试,所以买家要小心。
基本上,拦截@Embedded字段的getter并确保填充该字段。

public aspect NonNullEmbedded {

    // define a pointcut for any getter method of a field with @Embedded of type Validity with any name in com.ia.domain package
    pointcut embeddedGetter() : get( @javax.persistence.Embedded * com.company.model..* );

    /**
     * Advice to run before any Embedded getter.
     * Checks if the field is null.  If it is, then it automatically instantiates the Embedded object.
     */
    Object around() : embeddedGetter(){
        Object value = proceed();

        // check if null.  If so, then instantiate the object and assign it to the model.
        // Otherwise just return the value retrieved.
        if( value == null ){
            String fieldName = thisJoinPoint.getSignature().getName();
            Object obj = thisJoinPoint.getThis();

            // check to see if the obj has the field already defined or is null
            try{
                Field field = obj.getClass().getDeclaredField(fieldName);
                Class clazz = field.getType();
                value = clazz.newInstance();
                field.setAccessible(true);
                field.set(obj, value );
            }
            catch( NoSuchFieldException | IllegalAccessException | InstantiationException e){
                e.printStackTrace();
            }
        }

        return value;
    }
}
8ftvxx2r

8ftvxx2r5#

你可以使用nullsafe getter。

public Direito getDireito() {
    if (direito == null) {
        direito = new Direito();
    }
    return direito;
}

相关问题