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
Java 如何强制hibernate调用设置器方法填充类字段?_Java_Hibernate_Jpa - Fatal编程技术网

Java 如何强制hibernate调用设置器方法填充类字段?

Java 如何强制hibernate调用设置器方法填充类字段?,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个持久类,它有一个临时字段,表示这个类的API版本(我为API请求使用的字段子集)。这个字段是@Transient,因为我简单地使用其他字段来创建它 问题是hibernate使用默认的空构造函数来实例化类,并使用反射来访问字段。。。因此,我不能在constrorctor或setter方法调用上实例化我的瞬态类 我尝试使用getter方法代替字段来强制hibernate使用setter,但没有成功 我试图在字段上使用@Access(AccessType.PROPERTY),但没有成功 如何强

我有一个持久类,它有一个临时字段,表示这个类的API版本(我为API请求使用的字段子集)。这个字段是
@Transient
,因为我简单地使用其他字段来创建它

问题是hibernate使用默认的空构造函数来实例化类,并使用反射来访问字段。。。因此,我不能在constrorctor或setter方法调用上实例化我的瞬态类

我尝试使用getter方法代替字段来强制hibernate使用setter,但没有成功

我试图在字段上使用
@Access(AccessType.PROPERTY)
,但没有成功

如何强制hibernate调用设置器方法填充类字段

@Entity
public class User {

    @Transient
    private ApiUser tempUser = new ApiUser ();

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Access(AccessType.PROPERTY)
    @Column(nullable = false)
    private String name;
    @Access(AccessType.PROPERTY)
    @Column(nullable = false, unique = true)
    private String username;
@Access(AccessType.PROPERTY)
    @Column(nullable = false)
    private String userId;

//lots of others fields//
public void setUsername(String username) {
        this.username = username;
        this.tempUser.setUsername(username);
    }
public void setUserId(String userId) {
        this.userId = userId;
        this.tempUser.setId(Long.parseLong(userId));
    }

默认情况下,访问类型由放置标识符批注(@Id)的位置定义。如果您将它放在字段上-它将是AccessType.field,如果您将它放在getter上-它将是AccessType.PROPERTY

有时,您可能不希望注释字段,而希望注释属性(例如,因为您希望在getter中有一些任意逻辑,或者因为您喜欢这样做。)在这种情况下,您必须定义getter并将其注释为AccessType.PROPERTY

据我所知,如果在任何实体字段/方法上指定AccessType.FIELD或AccessType.PROPERTY,则必须为整个类指定默认行为。这就是为什么需要在类级别使用AccessType.FIELD(尽管AccessType.FIELD是默认值)

现在,如果phnnumber字段中没有@Transient,JPA将为您提供一个3列表:

身份证, phnnumber, getphnnumber。 这是因为它将对所有实体字段(id和phnnumber)使用AccessType.FIELD,同时对getter(getPhnnumber())使用AccessType.PROPERTY。 您将在数据库中以两次映射的电话号码结束

因此,需要@Transient注释-这意味着实体不会将字段的值存储在底层存储中,而是存储getter返回的值。

可能重复您刚刚复制粘贴的hey man,甚至不想格式化它。。。