休眠注释放置问题

2022-09-01 20:20:24

我有一个我认为是一个简单的问题。我见过两种方式的例子。问题是 - “为什么我不能在字段上放置注释?让我举个例子.

@Entity
@Table(name="widget")
public class Widget {
 private Integer id;

 @Id
 @GeneratedValue(strategy=GenerationType.AUTO)
 public Integer getId() { return this.id; }
 public Integer setId(Integer Id) { this.id = id;}
}

上面的代码工作正常(假设那里没有拼写错误)。当注释被放置在酒店的入口处时,一切都很完美。

但是,这对我来说似乎很尴尬。在我看来,把注释放在场上会更干净,就像这样——

@Entity
@Table(name="widget")
public class Widget {
 @Id
 @GeneratedValue(strategy=GenerationType.AUTO)
 private Integer id;

 public Integer getId() { return this.id; }
 public Integer setId(Integer Id) { this.id = id;}
}

我见过两种方式的例子。但是,当我运行第二个示例时,我得到以下结果...

java.lang.NullPointerException
    at com.widget.util.hibernate.HibernateSessionFactory$ThreadLocalSession.initialValue(HibernateSessionFactory.java:25)
    at com.widget.util.hibernate.HibernateSessionFactory$ThreadLocalSession.initialValue(HibernateSessionFactory.java:1)
    at java.lang.ThreadLocal$ThreadLocalMap.getAfterMiss(Unknown Source)
    at java.lang.ThreadLocal$ThreadLocalMap.get(Unknown Source)
    at java.lang.ThreadLocal$ThreadLocalMap.access$000(Unknown Source)
    at java.lang.ThreadLocal.get(Unknown Source)
    at com.widget.util.hibernate.HibernateSessionFactory.get(HibernateSessionFactory.java:33)
    at com.widget.db.dao.AbstractDao.(AbstractDao.java:12)
    at com.widget.db.dao.WidgetDao.(WidgetDao.java:9)
    at com.widget.db.dao.test.WidgetDaoTest.findById(WidgetDaoTest.java:17)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    ...

这是(第25行已标记)的骨架....HibernateSessionFactory

protected Session initialValue() {
    SessionFactory sessionFactory = null;
    try {
        Configuration cfg = new AnnotationConfiguration().configure();
        String url = System.getProperty("jdbc.url");
        if (url != null) {
            cfg.setProperty("hibernate.connection.url", url);
        }
        sessionFactory = cfg.buildSessionFactory();
    }
    catch (Exception e) {
    }

    Session session = sessionFactory.openSession();  // LINE 25
    return session;
}

有人知道这里发生了什么吗?


答案 1

从性能和设计的角度来看,在 getter 上使用注释比成员变量更好,因为如果将 getter setter 放在场上,则使用反射来调用,而不是方法。此外,如果您计划使用验证和休眠的其他功能,则可以将所有批注放在一个位置,而不是将它们分散在各个地方。

我的建议是使用方法而不是成员变量。

从文档中

根据您是批注字段还是方法,Hibernate 使用的访问类型将是字段或属性。EJB3 规范要求您在将要访问的元素类型上声明注释,即 getter 方法(如果使用属性访问,则为 getter 方法),如果使用字段访问,则声明字段。应避免在字段和方法中混合使用 EJB3 注释。休眠将从@Id或@EmbeddedId的位置猜测访问类型。


答案 2

你让我走上了正确的轨道工具包。谢谢。这是交易...当然,我人为的例子并没有包括整个故事。我的Widget类实际上比我给出的例子大得多。我有几个额外的字段/getters,我正在混合我的注释。所以我在球场上注释@Id,而其他人则在吸盘上注释。

因此,这个故事的寓意是,你不能混合注释位置。所有批注要么都在字段上,要么在 getter 方法上。长时间的Java和Hibernate,对Notess的新手。每天学习一些东西。

一旦我知道谷歌做什么,我遇到了这个很有帮助- http://chstath.blogspot.com/2007/05/field-access-vs-property-access-in-jpa.html

当然,这现在提出了一个问题,即从设计和性能的角度来看,哪个更好。


推荐