我有一个简单的问题。我已经看过两种方式的例子。问题是-“为什么不能在字段上放置注释?”。让我举一个例子....
@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
setter调用(如果放置在字段上)。同样,如果您打算使用验证和hibernate的其他功能,则将所有注释都放在一个位置,而不是将它们分散在整个位置。
我的建议是使用方法而不是成员变量。
从文档中
根据您是否注释字段或方法,Hibernate使用的访问类型将是字段或属性。EJB3规范要求您在将要访问的元素类型上声明注释,即,如果使用属性访问,则为getter方法;如果使用字段访问,则为字段。应该避免在字段和方法中混用EJB3注释。Hibernate将从@Id或@EmbeddedId的位置猜测访问类型。
问题内容: 我有一个简单的问题。我已经看到了两种方式的示例。问题是-“为什么不能在字段上放置注释?”。让我举一个例子.... 上面的代码很好用(假设那里没有错字)。当将注释放在属性的getter上时,一切就完美了。 但是,这对我来说似乎很尴尬。在我看来,将注解放在字段上比较干净,就像这样- 我已经看到了两种方式的示例。但是,当我运行第二个示例时,我得到以下信息… 这是(标有第25行)… 的骨架。
问题内容: hibernate注释应该放在哪里? 它是我的实例变量上方的线吗?还是在吸气剂之前?还是在二传手之前?还是真的不重要吗? 非常感谢 问题答案: 您可以将它们放在 野外 或 吸气剂上 。从《 Hibernate注释参考指南》中: 2.2.1。将POJO标记为持久实体 (…) 根据您是否注释字段或方法,Hibernate使用的访问类型将是字段或属性。EJB3规范要求您在将要访问的元素类型上
问题内容: 我正在尝试将Hibernate 4仅用于注释和一个文件。我做了自己的注释,并使用反射将其添加到配置中。我可以用这种方式很好地使用Hibernate 4,但是我的配置是使用不推荐使用的方法构建的。 (不建议使用的代码:)。 甚至hibernate 4文档也显示以这种方式构建配置。 如果我尝试使用新方法(,则不会得到相同的结果,并且似乎很多不必要的代码可以完全执行不推荐使用的方法。但是,我
我最近的目标是构建一个Spring Boot应用程序,但不需要任何XML配置文件(或尽可能少),因此我希望避免使用一些XML文件(即web.XML),特别是对于一些bean定义部分。 更难的部分来了。 我想使用@AutoWired注释将一个SessionFactory bean注入到类中,但每次尝试启动应用程序时,我都得到: unsatisfiedDependencyException:创建名为“
我在Hibernate(4.3.0)中遇到了一个问题,其中as单向@OneToMany返回重复项。 我的数据库结构(MySQL与InnoDB),其中作为“条目”表与“entry_address”表有1: N关系。“条目”表是主表,“entry_address”是“条目”表的子表。 下面是“entry”实体的最小代码。 以下是“entry_address”实体的最小代码: 这是Hibernate完成
我有一个包含三个字段的表,比如a、b、c。我想添加一个约束,确保如果a不为null,那么b和c也不为null。我已经使用以下SQL完成了这项工作 使用hibernate注解@Check有没有办法达到同样的效果? 我找不到一个有用的注释示例,开发人员倾向于根本不使用它吗?