Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
hibernate如何填充实体_Hibernate - Fatal编程技术网

hibernate如何填充实体

hibernate如何填充实体,hibernate,Hibernate,非常愚蠢的问题,因为我已经使用hibernate一段时间了,但我遇到了一个特殊情况,突然意识到我不确定hibernate是如何填充DB实体的 public class User { ... @Column private String name; public void setName(String name) { this.name = name; } } 当hibernate创建用户的新实例时(从DB加载时),它将如何填充该实例的属

非常愚蠢的问题,因为我已经使用hibernate一段时间了,但我遇到了一个特殊情况,突然意识到我不确定hibernate是如何填充DB实体的

public class User {
    ...
    @Column
    private String name;

    public void setName(String name) {
        this.name = name;
    }
}
当hibernate创建用户的新实例时(从DB加载时),它将如何填充该实例的属性名?我一直认为hibernate会为此调用setName,但我现在遇到的情况让我怀疑hibernate会忽略setter并(通过反射)直接设置字段的值

谢谢,
斯蒂金

“访问”属性允许您 控制Hibernate如何访问 运行时的属性。默认情况下, Hibernate将调用该属性 获取/设置一对。如果您指定 access=“field”,Hibernate将绕过 获取/设置对并访问字段 直接使用反射。你可以 指定您自己的财产战略 通过命名一个 实现接口 org.hibernate.property.PropertyAccessor


默认情况下,hibernate使用反射属性访问

如果您想了解更多详细信息,我建议查看系统安全策略(SecurityManager)

Hibernate注释和JPA使用注释的位置来确定要使用的访问类型。在上面提供的示例中,它将使用字段访问

从:

根据您是注释字段还是注释方法,Hibernate使用的访问类型将是字段还是属性。EJB3规范要求您在将被访问的元素类型上声明注释,即如果使用属性访问,则声明getter方法;如果使用字段访问,则声明字段。应避免在字段和方法中混合注释


没有愚蠢的问题。没有,但有些人会因为问这些问题而感到愚蠢:-)你基于什么“Hibernate默认使用反射属性访问”?所有3个答案都非常有用。我将注释移动到getter,这解决了我面临的问题。还要感谢Vash和Mat。只需补充一条评论;只有当我将所有注释移到getter,而不仅仅是我需要的注释时,它才起作用。最后,我将所有注释移回字段,并将@Access(AccessType.PROPERTY)添加到需要使用getter/Setter的字段中。
access="field|property|ClassName"