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.