【发布时间】:2012-05-07 05:47:44
【问题描述】:
是否可以通过 Hibernate XML 映射配置避免主键设置器?使用注释时,您不必声明 setter 方法。见例子。我使用的是 Hibernate 4.1.2 版。
-
基于 XML 的配置
public class Entity { private Integer id; public Integer getId() { return id; } } <class name="Language" table="language"> <id name="id" column="id"> <generator class="native" /> </id> </class>初始化Hibernate时抛出异常
Caused by: org.hibernate.PropertyNotFoundException: Could not find a setter for property id in class net.kreuzman.eshop.core.domain.l10n.Language at org.hibernate.property.BasicPropertyAccessor.createSetter(BasicPropertyAccessor.java:252) at org.hibernate.property.BasicPropertyAccessor.getSetter(BasicPropertyAccessor.java:245) at org.hibernate.mapping.Property.getSetter(Property.java:325) at org.hibernate.tuple.entity.PojoEntityTuplizer.buildPropertySetter(PojoEntityTuplizer.java:444) at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:182) at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:82) ... 49 more -
基于注解的配置
@Entity @Table(name="entity") public class Entity { @Id @Column(name="id") @GeneratedValue(strategy=GenerationType.AUTO) private Integer id; public Integer getId() { return id; } }
这很好用。
【问题讨论】:
-
不,你需要一个二传手——这有什么问题?
-
@Woody 我不想为成员声明 setter,它不应该被应用程序更改。将其声明为
private对我来说似乎不太好。 -
我认为你需要setter,但你不能将它声明为非公开的吗? (例如
protected)。这只是猜测。我不是专家。 -
@Boris Strandjev 是的,我可以将其声明为非公开,但为什么呢?它永远不会被使用。对我来说似乎很尴尬。
-
@krocan - 你错了。它将被使用,但通过反射。如果这对您来说似乎很尴尬,为什么在注释案例中声明一个没有 setter 的私有字段呢?
标签: java xml hibernate jpa hbm