36

我想要的是:

@Embedded(nullable = false)
private Direito direito;

但是,如您所知,@Embeddable 没有这样的属性。

有没有正确的方法来做到这一点?我不想要解决方法。

4

5 回答 5

41

可嵌入组件(或复合元素,无论您想如何称呼它们)通常包含多个属性,因此映射到多个列。因此,可以以不同的方式处理整个为 null 的组件;J2EE 规范没有规定一种或另一种方式。

如果组件的所有属性都为 NULL(反之亦然),则 Hibernate 认为组件为 NULL。因此,您可以声明一个(任何)属性不为空(在 on 内@Embeddable或作为@AttributeOverrideon的一部分@Embedded)来实现您想要的。

或者,如果您使用的是 Hibernate Validator,您可以注释您的属性,@NotNull尽管这只会导致应用程序级别的检查,而不是数据库级别的检查。

于 2009-08-24T19:54:48.170 回答
28

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

于 2016-09-02T08:48:53.527 回答
14

将虚拟字段添加到标记为 @Embeddable 的类中。

@Formula("0")
private int dummy;

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

于 2011-03-10T12:45:25.460 回答
1

我对之前提出的任何一个建议都不太满意,所以我创建了一个方面来为我处理这个问题。

这没有经过全面测试,并且绝对没有针对嵌入式对象的集合进行测试,因此请注意买家。但是,到目前为止似乎对我有用。

基本上,拦截该@Embedded字段的吸气剂并确保填充该字段。

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;
    }
}
于 2014-07-08T18:20:31.310 回答
0

您可以使用 nullsafe getter。

public Direito getDireito() {
    if (direito == null) {
        direito = new Direito();
    }
    return direito;
}
于 2014-10-24T08:25:53.000 回答