使用hbm.xml在Hibernate中强制设置主键

时间:2012-04-26 13:23:22

标签: java xml hibernate jpa hbm

是否可以避免使用Hibernate XML映射配置的主键设置器?使用注释时,您不必声明setter方法。见例子。我正在使用Hibernate 4.1.2版。

  1. 基于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
    
  2. 基于注释的配置

    @Entity
    @Table(name="entity")
    public class Entity {
        @Id
        @Column(name="id")
        @GeneratedValue(strategy=GenerationType.AUTO)
        private Integer id;
    
            public Integer getId() {
                 return id;
            }
    }
    
  3. 这很有效。

3 个答案:

答案 0 :(得分:3)

您可以将访问类型设置为字段,这与将注释放在字段上的效果相同。

<class name="Language" table="language">
    <id name="id" column="id" access="field">
        <generator class="native" />
    </id>
</class>

答案 1 :(得分:0)

我认为hibernate通过反射创建对象(Class.newInstance()),这就是为什么它需要no args构造函数。那样 - 我不知道如何可以省去二手房产的二传手。你可以将未使用的字段标记为@Transient,但就是这样。

答案 2 :(得分:0)

@GeneratedValue(strategy = GenerationType.IDENTITY)

而不是自动