Hibernate在java文件中的注释位置

时间:2013-11-26 08:48:28

标签: hibernate hibernate-annotations

我正在关注“Beginning hibernate”一书中的hibernate教程。 我看到像@Id,@ Column这样的注释是在getXXX()方法之上指定的。

如:

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

@Column(unique=true)
public String getName()
{
    return name;
}

但不是在自己的属性定义中:

private long id;
private String name;

是否有链接/引用指定注释的放置位置?以及它背后的原因。 进一步来说; Hibernate如何解释不同注释的位置,是否有指南?

我在谈论javax.persistence。* annotations

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 个答案:

答案 0 :(得分:1)

可以在字段或方法上放置注释。您选择的选项实际上是个人偏好的问题,虽然我已经看到它说更喜欢字段而不是方法。

我个人更喜欢字段注释,因为我觉得它们更容易使用:

  • 所有持久性映射都位于源代码的顶部 文件。
  • 如果您的实体中有任何其他方法无关紧要 使用JPA映射,然后必须使用@Transient进行注释 哪个'看似不对'。
  • 使用属性访问时,您必须包含一个getter 即使你不需要一个(虽然这可以是私人的 (或至少受到保护)。
  • 如果您想封装对关联的添加/删除操作 通常需要返回一个包装的Unmodifiable集合: 如果持久性映射在属性上,则无法执行此操作。

在扫描你的类时,Hibernate首先会查找带有@Id注释的字段或方法,然后相应地寻找其他映射,即。如果@Id在一个字段上,则只会扫描其他字段:默认情况下,方法上定义的任何映射都将被忽略,反之亦然,尽管可以使用以下方法修改此行为:

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

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