我需要使用具有多对一关系的@Access=FIELD 注释吗?

Posted

技术标签:

【中文标题】我需要使用具有多对一关系的@Access=FIELD 注释吗?【英文标题】:Am I need to use @Access=FIELD annotation with many-to-one relationship? 【发布时间】:2012-09-16 19:16:50 【问题描述】:

我有被分类的实体。每个实体可以属于许多类别,所以我有一对多的关联。

下面的 ORM 是否正确:

@OneToMany
@Access(AccessType.FIELD)
private Set<Category> parents = new HashSet<Category>();
public Set<Category> getParents() 
    return parents;

public boolean addParent(Category parent) 
    return parents.add(parent);

public boolean removeParent(Category parent) 
    return parents.remove(parent);

我的具体问题是我是否需要使用@Access 注释?如果我不使用它,那么 Hibernate 怎么知道不映射 getParents getter?

【问题讨论】:

【参考方案1】:

我不知道你是否需要@Access(AccessType.FIELD) 注释,因为这取决于一些默认值(见下文)。 但如果您使用字段访问类型(默认或@Access(AccessType.FIELD)),那么 Hibernate 将直接访问 FIELD 而不是使用 getter 或 setter!

有关访问类型确定算法的更多详细信息,请参阅Hibernate Reference, chapter 5.1.4.1.2. Access type。

默认情况下,类层次结构的访问类型由@Id 或@EmbeddedId 注释的位置定义。如果这些注释在一个字段上,那么只有字段被认为是持久性的,并且通过该字段访问状态。如果 getter 上有注释,那么只有 getter 被考虑用于持久性,并且通过 getter/setter 访问状态。这在实践中效果很好,是推荐的方法。

【讨论】:

那么你怎么知道我不需要@Access 注释,而你却不知道我把@Id 放在哪里? @Suzan Cioc:是的,你是对的。下次贴出完整的相关代码,方便大家答题,不用花太多空闲时间。 我不知道在这种情况下什么是相关的,抱歉。

以上是关于我需要使用具有多对一关系的@Access=FIELD 注释吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何向具有多对一关系的模型的 Django 管理员添加可排序的计数列?

连接两个共享多对一关系的 SQL 表

将多个文件发布到数据库 - 多对一关系的空值

针对多对一关系优化 SQL 查询

一对多和多对一关系的区别

Doctrine 2 - 多对一关系的外键不允许空值