2013-11-26 39 views
0

我正在从“Beginning hibernate”一书中阅读hibernate教程。 我发现像@Id,@Column这样的注释是在getXXX()方法的上面指定的。java文件中的Hibernate注释位置

如:

@Id 
@GeneratedValue 
public long getId() 
{ 
    return id; 
} 

@Column(unique=true) 
public String getName() 
{ 
    return name; 
} 
在属性定义它的自我喜欢

但不是:

private long id; 
private String name; 

是否有一个链接/参考,它指定注解应该放在哪里?以及背后的推理。 更具体地说; Hibernate如何解释不同注释的位置,是否有指导? 。

我说的是位于javax.persistence *注释

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 

我已经看过 http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single

我使用:

Hibernate 4.2.6.Final 
Windows 8, 32 bit. 

回答

1

注释可以放在字段或在方法上。你选择的选项实际上是个人喜好的问题,尽管我已经看到它选择字段而不是方法。

我个人更喜欢字段注释,因为我觉得他们更容易与工作:

  • 所有的持久性映射位于源 文件的顶部。
  • 如果你有任何其他方法在你的实体不关心 与JPA映射然后这些必须用@Transient 这似乎是错误的注释。
  • 使用属性访问时,您必须包括一个getter 即使你不需要一个(虽然这可以是私有的 (或者至少保护)。
  • 如果你想encapsulte添加/删除操作对于关联设定,然后 经常需要返回一个包裹,不可修改的Collection: 你不能做到这一点,如果持久性映射是对房地产

当扫描你的类Hibernate会首先寻找一个字段或方法与@Id注释,然后将相应地查找其他映射,即如果@Id位于字段上唯一的其他字段将被扫描的:在一个方法中定义的任何映射将默认,被忽略,并且反之亦然虽然这种行为可以使用进行修改:

@Access(AccessType.PROPERTY) 
@Access(AccessType.FIELD) 

What is the purpose of AccessType.FIELD, AccessType.PROPERTY and @Access