Vejam essas classes:
[code]@Entity( access = AccessType.FIELD )
@NamedQueries({
@NamedQuery( name = “Page.containsLabel”,
queryString = “” ),
@NamedQuery( name = “Page.findByUser”,
queryString = “” ),
@NamedQuery( name = “Page.findRootPages”,
queryString = “” ),
@NamedQuery( name = “Page.findWatchedPages”,
queryString = “” ),
@NamedQuery( name = “Page.findHotPages”,
queryString = “” ),
@NamedQuery( name = “Page.findBookmarkedPages”,
queryString = “” ),
@NamedQuery( name = “Page.findByDate”,
queryString = “” ), } )
@Filters( {
// a null status points out to a open page
@Filter( name = “Page.FilterDeleted”, condition = “status is null” ) } )
@LuceneAnnotation
public class Page extends LiberEntity<Page> implements Identifiable<Long> {
@Id( generate = GeneratorType.AUTO )
@Column( name = "page_id" )
@LuceneId( luceneId = "PageId" )
private Long id;
private int version;
private int views;
@LuceneField
private Calendar date;
@LuceneField( isContent = true )
private String title;
@Type( type = "text" )
@LuceneField( isContent = true )
private String text;
@OneToMany( fetch = FetchType.LAZY, mappedBy="page" )
private Set<Comment> replies = new HashSet<Comment>();
@ManyToMany( fetch = FetchType.LAZY )
@AssociationTable(
table = @Table( name = "pages_labels" ),
joinColumns = @JoinColumn( name = "fk_page_id" ),
inverseJoinColumns = @JoinColumn( name = "fk_label_id" ) )
private Set<Label> labels = new HashSet<Label>();
@ManyToOne( targetEntity = "br.foo.bar.domain.User" )
@JoinColumn( name = "fk_user_id" )
private User author;
@ManyToMany( fetch = FetchType.LAZY )
@AssociationTable(
table = @Table( name = "pages_watchers" ),
joinColumns = @JoinColumn( name = "fk_page_id" ),
inverseJoinColumns = @JoinColumn( name = "fk_user_id" ) )
private Set<User> watchers = new HashSet<User>();
@ManyToMany( fetch = FetchType.LAZY )
@AssociationTable(
table = @Table( name = "pages_bookmarkers" ),
joinColumns = @JoinColumn( name = "fk_page_id" ),
inverseJoinColumns = @JoinColumn( name = "fk_user_id" ) )
private Set<User> bookmarkers = new HashSet<User>();
private String status;
private boolean acceptHtml;
// gets, sets, bla bla bla
}[/code]
[code]@Entity( access = AccessType.FIELD )
@NamedQueries({
@NamedQuery( name = “User.findByRole”, queryString = “” ),
@NamedQuery( name = “User.findByGroup”, queryString = “” ),
@NamedQuery( name = “User.findByStatus”, queryString = “” ),
@NamedQuery( name = “User.findMoreActive”, queryString = “” ),
@NamedQuery( name = “User.findLessActive”, queryString = “” ),
@NamedQuery( name = “User.findByRegisterDate”, queryString = “” ),
@NamedQuery( name = “User.findByLastVisitDate”, queryString = “” ),
@NamedQuery( name = “User.findAbsenteeUsers”, queryString = “” ),
@NamedQuery( name = “User.findByEmail”,
queryString = “select u from User u where u.email = ?” ),
@NamedQuery( name = “User.findByLogin”,
queryString = “select u from User u where u.login = ?” )
}
)
public class User extends NextEntity<User> implements Identifiable<Long> {
@Id( generate = GeneratorType.AUTO )
@Column( name = "user_id" )
private Long id;
@Column( nullable = false )
private String login;
@Column( nullable = false )
private String password;
private String name;
private String email;
@ManyToMany(
fetch = FetchType.LAZY,
targetEntity = "br.foo.bar.domain.Role" )
@AssociationTable(
table = @Table( name = "users_roles" ),
joinColumns = @JoinColumn( name = "fk_user_id" ),
inverseJoinColumns = @JoinColumn( name = "fk_role_id" ) )
private Set<Role> roles = new HashSet<Role>();
@ManyToMany(
fetch = FetchType.LAZY,
targetEntity = "br.foo.bar.domain.Group" )
@AssociationTable(
table = @Table( name = "users_groups" ),
joinColumns = @JoinColumn( name = "fk_user_id" ),
inverseJoinColumns = @JoinColumn( name = "fk_group_id" ) )
private Set<Group> groups = new HashSet<Group>();
@OneToOne( fetch = FetchType.LAZY )
@JoinColumn( name = "fk_status_id", nullable = false )
private Status status;
@Embedded
@CompositeField(
attributes={
@LuceneField(attribute="signature"),
@LuceneField(attribute="profile"),
}
)
private SecondaryInfo info;
// gets, sets, bla bla bla
}[/code]
E algumas observações:
- Acredito que depois de algum tempo, o Tiger se tornará padrão e annotations serão a maneira mais comumente usada para fazer o mapeamento com o Hibernate (e talvez outros concorrentes). Apesar de ser possivel mapear algumas classes com xml e outras com anotações, não me parece adequado misturar as duas coisas;
- NamedQueries, as quais podem conter hql muito grandes, podem ser colocadas em um package-info, então, elas não necessariamente ficarão nas classes de dominio, o que alivia a quantidade de annotations nessas classes;
- Em projetos maiores, outros conjuntos de annotations podem ser usados e a quantidade de metadados pode crescer um bocado;
- Eu acho annotations um recurso extremamente util;
E a pergunta, annotations são muito verborágicas e deixam o codigo poluido? Ou falta apenas se acustumar com elas?
valeuz…