3

私のエンティティがフィールドにまたは同様の注釈をmodel持っているかどうかを確認するには、次のコードを実行する必要があります。nullable=false

import javax.persistence.Column;
import .....

private boolean isRequired(Item item, Object propertyId) {
        Class<?> property = getPropertyClass(item, propertyId);

        final JoinColumn joinAnnotation = property.getAnnotation(JoinColumn.class);
        if (null != joinAnnotation) {
            return !joinAnnotation.nullable();
        }

        final Column columnAnnotation = property.getAnnotation(Column.class);
        if (null != columnAnnotation) {
            return !columnAnnotation.nullable();
        }

        ....
        return false;
    }

これが私のモデルのスニペットです。

import javax.persistence.*;
import .....

@Entity
@Table(name="m_contact_details")
public class MContactDetail extends AbstractMasterEntity implements Serializable {

    @Column(length=60, nullable=false)
    private String address1;

注釈に慣れていない人@Columnのために、ヘッダーは次のとおりです。

@Target({METHOD, FIELD})
@Retention(RUNTIME)
public @interface Column {

isRequiredが時々戻ってくることを期待してtrueいますが、そうではありません。私はすでに自分のプロジェクトでmvn cleanandmvn installを実行しましたが、それは役に立ちません。

Q1: 何が間違っていますか?

Q2: よりクリーンなコーディング方法はありますisRequiredか (おそらくジェネリックをより有効に活用する)?

4

2 に答える 2

4
  1. propertyクラスを表します (それは ですClass<?>)
  2. @Column@JoinColumnフィールド/メソッドにのみ注釈を付けることができます。

したがって、これらの注釈が に表示されることはありませんproperty

Employee エンティティの email プロパティが必要かどうかを出力するコードを少し変更したバージョン:

public static void main(String[] args) throws NoSuchFieldException {
      System.out.println(isRequired(Employee.class, "email"));
}

private static boolean isRequired(Class<?> entity, String propertyName) throws NoSuchFieldException {
    Field property = entity.getDeclaredField(propertyName);

    final JoinColumn joinAnnotation = property.getAnnotation(JoinColumn.class);
    if (null != joinAnnotation) {
        return !joinAnnotation.nullable();
    }

    final Column columnAnnotation = property.getAnnotation(Column.class);
    if (null != columnAnnotation) {
        return !columnAnnotation.nullable();
    }

    return false;
}

JPAアノテーションはフィールドまたはメソッドのいずれかにある可能性があるため、これは中途半端なソリューションであることに注意してください。getFiled()また、 /などのリフレクション メソッドの違いにも注意してgetDeclaredField()ください。前者は継承されたフィールドも返しますが、後者は親から継承されたものを無視して特定のクラスのフィールドのみを返します。

于 2013-02-19T18:57:37.987 に答える
0

次のコードが機能します。

    @SuppressWarnings("rawtypes")
    private boolean isRequired(BeanItem item, Object propertyId) throws SecurityException {

        String fieldname = propertyId.toString();

        try {
            java.lang.reflect.Field field = item.getBean().getClass().getDeclaredField(fieldname);
            final JoinColumn joinAnnotation = field.getAnnotation(JoinColumn.class);
            if (null != joinAnnotation) {
                return !joinAnnotation.nullable();
            }

            final Column columnAnnotation = field.getAnnotation(Column.class);
            if (null != columnAnnotation) {
                return !columnAnnotation.nullable();
            }



        } catch (NoSuchFieldException e) {
            //not a problem no need to log this event.
            return false;
        } 
    }
于 2013-02-19T19:56:18.790 に答える