Java Hibernate中带hbm.xml的主键的强制设置器

Java Hibernate中带hbm.xml的主键的强制设置器,java,xml,hibernate,jpa,hbm,Java,Xml,Hibernate,Jpa,Hbm,使用HibernateXML映射配置是否可以避免主键的setter?使用注释时,不必声明setter方法。参见示例。我使用的是Hibernate版本4.1.2 基于XML的配置 public class Entity { private Integer id; public Integer getId() { return id; } } <class name="Language" table="language"> <id

使用HibernateXML映射配置是否可以避免主键的setter?使用注释时,不必声明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>
    
    @Entity
    @Table(name="entity")
    public class Entity {
        @Id
        @Column(name="id")
        @GeneratedValue(strategy=GenerationType.AUTO)
        private Integer id;
    
            public Integer getId() {
                 return id;
            }
    }
    

  • 这很好。

    我认为hibernate通过反射(Class.newInstance())创建对象,这就是它需要无参数构造函数的原因。这样-我看不出如何为已使用的属性省略setter。您可以将未使用的字段标记为@Transient,但仅此而已

    您可以将访问类型设置为字段,这将实现与将注释放在字段上相同的功能

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

    你需要一个setter而不是auto

    不,你需要一个setter-这有什么问题吗?@Woody我不想为成员声明setter,它永远不应该被应用程序更改。声明它是私有的对我来说似乎不太好。我想你们需要setter,但你们不能声明它是非公有的吗?(例如受保护的)。这只是猜测。我不是专家。@Boris Strandjev是的,我可以宣布它非公开,但为什么?它永远不会被使用。我觉得很尴尬。@krocan-你错了。它将被使用,但通过反射。如果您觉得这很尴尬,为什么在注释案例中声明一个没有setter的私有字段却没有呢?是的,Hibernate通过反射创建对象,您还可以通过反射设置私有成员,所以您不需要setter方法。无论如何,它在使用注释时可以工作。请看问题。Opps-yep-我不久前才用过一次。谢谢,这就是我要找的!
    <class name="Language" table="language">
        <id name="id" column="id" access="field">
            <generator class="native" />
        </id>
    </class>
    
    @GeneratedValue(strategy = GenerationType.IDENTITY)