java - 如何强制 hibernate 调用 setter 方法来填充类字段?

标签 java hibernate jpa

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

问题是 hibernate 使用默认的空构造函数来实例化类和反射来访问字段......所以我无法在构造函数或 setter 方法的调用上实例化我的 transient 类

我试图注释 getter 方法而不是字段来强制 hibernate 使用 setter,但它没有用

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

如何强制 hibernate 调用 setter 方法来填充类字段?

@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 列表:

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

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

关于java - 如何强制 hibernate 调用 setter 方法来填充类字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42919360/

相关文章:

java - Java 中的图像作为 Int 数组

mysql - java.sql.SQLException : Access denied for user '' @'localhost' (using password: YES)

java - USE JpaWhere 带有列表 := Key

java - 如何从 webapp(某种程度上是 web 应用程序目录)访问静态文件?

java - 方法是否从单独的线程调用,在调用线程上运行?

java - 发送图像作为 API 响应

java - JPA如何使用级联删除删除作为onetoone目标的实体

java - 如何扫描包中的 Hibernate 实体而不是使用 hbm.xml?

mysql - 关于c3p0和hibernate

java - 两个实体之间存在多个关系时抛出异常