Criando Annotation Composta

Boa Tarde,
Estou tentando criar uma annotation do tipo da do hibernate JoinColumns onde ‘Existe uma annotation dentro de outra’, Exemplo:

@JoinColumns( {
@JoinColumn(name = “FIELD_1”, referencedColumnName = “FIELD_1”, insertable = false, updatable = false),
@JoinColumn(name = “FIELD_2”, referencedColumnName = “FIELD_2”, insertable = false, updatable = false), })

Criei ela com o target @Target(ElementType.ANNOTATION_TYPE)
Como um teste que não tem nada a v com seu real motivo de utilização, criei (estou tentando criar) uma annotation que realiza exatamente o que essa do hibernate faz:

Essa seria a annotation interna:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
@Documented
public @interface JoinColumn {
	String column();
	String inverseColumn();
}

e essa a externa:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface JoinColumns {
}

Agradeço a ajuda…

Tente alterar a externa pra ficar assim

@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface JoinColumns { JoinColumn[] value(); }

[quote=sunwebdeveloper]Boa Tarde,
Estou tentando criar uma annotation do tipo da do hibernate JoinColumns onde ‘Existe uma annotation dentro de outra’, Exemplo:

@JoinColumns( {
@JoinColumn(name = “FIELD_1”, referencedColumnName = “FIELD_1”, insertable = false, updatable = false),
@JoinColumn(name = “FIELD_2”, referencedColumnName = “FIELD_2”, insertable = false, updatable = false), })

Criei ela com o target @Target(ElementType.ANNOTATION_TYPE)
[/quote]

Entenda que uma anotação do tipo ANNOTATION_TYPE é usada para anotar outra anotação. Exemplos são @Retention e @Target
Elas são usadas em arquivos public @interface.

A sua notação precisa ter o mesmo tipo que JoinColumns.
Este tipo de anotação que tem um array de anotações é necessária devido à limitação logica de não poder anotar duas vezes a mesma coisa
com a mesma anotação ( que faz todo o sentido do mundo)

No java 7 esta restrição está agendada para ser removida.

Boa tarde Sergio,
Obrigado pela ajuda…

Veja como esta agora:
Pai

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
public @interface JoinColumns {
	JoinColumn [] joinColumn();
}

Filha

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
public @interface JoinColumn {
	String column();
	String inverseColumn();
}

Com o mesmo tipo: FIELD

e na minha classe, coloquei assim:

	@JoinColumns({
		@JoinColumn(column="a", inverseColumn="b")
		}
	)

Mas esta dando um erro de compilação: The attribute Value is undefinied for the annotation type JoinColumns, devo estar fazendo algo errada na utilização das annotations, certo ??
Obrigado.

do jeito que tá vc teria que usar a anotação assim:

@JoinColumns(joinColumn={ @JoinColumn(column="a", inverseColumn="b") } )

ou simplesmente, vc poderia definir o atributo como value, e não joinColumn

@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface JoinColumns { JoinColumn[] value(); }

Bom Dia Josemar,

Obrigado pela ajuda… eu ontem assim que postei a ultima msg me atentei a isso e refatorei meu atributo para value, confesso que não fui tentar descobrir o pq ?? Vc sabe ??
Obrigado.

[quote=sunwebdeveloper]Bom Dia Josemar,

Obrigado pela ajuda… eu ontem assim que postei a ultima msg me atentei a isso e refatorei meu atributo para value, confesso que não fui tentar descobrir o pq ?? Vc sabe ??
Obrigado. [/quote]

Value é o default. quando vc não escreve o nome do parametro da anotação, o java assume que é value. Mas precisa estar definido no annotation.
Por que isso que funciona quando vc chama o atributo de value e não faz value = {} , porque não precisa de por.