当前位置: 首页 > 面试题库 >

Hiberante注释放置问题

丁淇
2023-03-14
问题内容

我有一个简单的问题。我已经看到了两种方式的示例。问题是-“为什么不能在字段上放置注释?”。让我举一个例子....

@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;}
}

上面的代码很好用(假设那里没有错字)。当将注释放在属性的getter上时,一切就完美了。

但是,这对我来说似乎很尴尬。在我看来,将注解放在字段上比较干净,就像这样-

@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
    在com.widget.util.hibernate.HibernateSessionFactory $ ThreadLocalSession.initialValue(HibernateSessionFactory.java:25)
    在com.widget.util.hibernate.HibernateSessionFactory $ ThreadLocalSession.initialValue(HibernateSessionFactory.java:1)
    在java.lang.ThreadLocal $ ThreadLocalMap.getAfterMiss(未知来源)
    在java.lang.ThreadLocal $ ThreadLocalMap.get(未知来源)
    在java.lang.ThreadLocal $ ThreadLocalMap.access $ 000(未知源)
    在java.lang.ThreadLocal.get(未知来源)
    在com.widget.util.hibernate.HibernateSessionFactory.get(HibernateSessionFactory.java:33)
    在com.widget.db.dao.AbstractDao。(AbstractDao.java:12)
    在com.widget.db.dao.WidgetDao。(WidgetDao.java:9)
    在com.widget.db.dao.test.WidgetDaoTest.findById(WidgetDaoTest.java:17)
    在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
    在sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)
    在sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)
    在java.lang.reflect.Method.invoke(未知来源)
    ...

这是HibernateSessionFactory(标有第25行)… 的骨架。

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;
}

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


问题答案:

从性能和设计的角度来看,在getter上使用批注比在成员变量上更好,因为与方法相比,使用反射将getter设置器称为“反射”。另外,如果您打算使用验证和休眠的其他功能,则将所有注释都放在一个位置,而不是将它们分散在整个位置。

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

从文档中

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



 类似资料:
  • 问题内容: 我有一个简单的问题。我已经看过两种方式的例子。问题是-“为什么不能在字段上放置注释?”。让我举一个例子.... 上面的代码可以正常工作(假设那里没有错字)。当将注释放在属性的getter上时,一切就完美了。 但是,这对我来说似乎很尴尬。在我看来,将注解放在字段上比较干净,就像这样- 我已经看到了两种方式的示例。但是,当我运行第二个示例时,我得到以下信息… 这是(标有第25行)… 的骨架

  • 我们在spring boot应用程序中对bean、存储库和控制器的计时有一个奇怪的问题。 我们有一个有地图支持的NodeRepository。这个Map对象应该是我们使用@Bean注释创建的一个Map,但Spring似乎正在创建自己的Map,并将其注入到我们的NodeRepository中。这是一个问题,因为Spring假设了我们的键值,所以地图中的键是错误的。 以下是所有需要的代码: 组织。xx

  • 问题内容: hibernate注释应该放在哪里? 它是我的实例变量上方的线吗?还是在吸气剂之前?还是在二传手之前?还是真的不重要吗? 非常感谢 问题答案: 您可以将它们放在 野外 或 吸气剂上 。从《 Hibernate注释参考指南》中: 2.2.1。将POJO标记为持久实体 (…) 根据您是否注释字段或方法,Hibernate使用的访问类型将是字段或属性。EJB3规范要求您在将要访问的元素类型上

  • 问题内容: 休眠注释应该放在哪里? 它是我的实例变量上方的线吗?还是在吸气剂之前?还是在二传手之前?还是真的不重要吗? 非常感谢 问题答案: 您可以将它们放在 野外 或 吸气剂上 。从《 Hibernate注释参考指南》中: 2.2.1。将POJO标记为持久实体 (…) 根据您是否注释字段或方法,Hibernate使用的访问类型将是字段或属性。EJB3规范要求您在将要访问的元素类型上声明注释,即,

  • 我写我自己的CMS与教义2.5.4和纯PHP 5。 这是我的CMS(谷歌链接)。 在构建过程中,我反驳了这个错误: 错误NewsDAO:异常“条令\ORM\Mapping\MappingException”和消息“Class”News不是有效的实体或映射的超类。'in/var/www/html/xxxxx.com/public_html/vendor/doctor/orm/lib/doctor/o

  • 我在AspectJ实现方面遇到了一些问题! 我想为带有@myAnnotation注释的方法创建一个日志方法。 然而,这似乎不起作用。它没有记录任何东西! 我在中使用了断点来检查结果,但没有成功! 有人知道为什么这行不通吗?