質問

だいたい:

@Embedded(nullable = false)
private Direito direito;

しかし、どんな属性を@ヤ.

が正しくないという。僕は回避策.

役に立ちましたか?

解決

(あなたがそれらを呼び出すために好きまたは複合要素、)

組み込みコンポーネントは、通常、複数のプロパティが含まれているため、複数のカラムにマッピングされます。全成分であるヌルは、したがって、異なる方法で処理することができます。 J2EEの仕様では、一つの方法または別のものを指示していません。

Hibernateは、すべてのプロパティがNULL(またはその逆)である場合、コンポーネントはNULLであると考えています。そのため、プロパティの(任意の)は、あなたが望むものを達成するために(@Embeddable内または@AttributeOverride@Embeddedの一部としてのいずれか)がnullでないと1を宣言することができます。

あなたはHibernateバリを使用している場合、これが唯一のアプリケーション・レベルのチェックではなく、デシベルレベルになりますが、

また、あなたは@NotNullであなたの財産に注釈を付けることができます。

他のヒント

使用可能で"hibernate.create_empty_composites.有効"以来、Hibernate5.1への挙動を変化させるこ照 https://hibernate.atlassian.net/browse/HHH-7610 )

@Embeddableをマークされているクラスにダミーフィールドを追加します。

@Formula("0")
private int dummy;

https://issues.jboss.org/browse/HIBERNATE-50するを参照してください。ます。

私は以前に作られた提案のいずれかで、あまりにも興奮しなかったので、私は私のためにこれを扱うでしょう様相を作成します。

これは完全にテストされていない、と確かに埋め込まれたオブジェクトのコレクションに対してテストされていませんので、買い手-用心されます。しかし、これまでの私のために動作するようです。

基本的に、@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;
    }
}

あなたはnullsafeゲッターを使用することができます。

public Direito getDireito() {
    if (direito == null) {
        direito = new Direito();
    }
    return direito;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top