当前位置: 首页 > 知识库问答 >
问题:

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

山鸿彩
2023-03-14

我试图用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));
    }

共有1个答案

融宏伟
2023-03-14

默认情况下,访问类型由放置标识符注释(@id)的位置定义。如果把它放在字段上,它将是accesstype.field,如果把它放在getter上,它将是accesstype.property。

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

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

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

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

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

 类似资料:
  • 问题内容: 下面的代码在运行时显然会打印出“ B1 / A2 / B2”。现在,是否可以改为打印“ A1 / A2 / B2”(即A#method2()应该在A而不是B上调用method1())? 注意:我不需要获得传递多态性,这个问题仅出于好奇。 问题答案: 是的,您可以做到。在包 a中 定义A : 在包 b中 定义B : 将测试放入软件包 a中 并运行它。结果是A1 / A2 / B2。当然这

  • 问题内容: 我想在调用构造函数时强制用户填写可选参数: 当前,以下代码有效: 我想防止它。我想到了这一点: 不是一个选择,因为我需要使用逗号分隔的args的能力。 有什么好的解决方案可以做到这一点吗?请不要说varargs参数必须是可选的。问题不在于此。 问题答案: 也许下面是一个额外的默认构造函数?

  • 我正在使用作为覆盖层。它应该和它的父容器一样宽和一样高。然而,由于某种奇怪的原因,它不是垂直填充其父级的(而是水平填充)。下面是相关的XML: 使用上面的代码,覆盖层也不可见(其高度为)。当我在内部放置时,它会展开以适应。简而言之,它的行为就好像它的高度被设置为。 我如何强制它装满它的容器,同时让它空着?

  • 这里有一个关于我要做的事情的参考...访问JavaFX TableView ObservableRayList中的子类属性 但是仅仅使用示例代码,我基本上重写了2个方法,每个3次...在实际的程序中还有更多的东西。(再多一点点)

  • 你知道我如何使用FireStore填充文档上的引用字段吗?

  • 问题内容: 我有一个WebMethod,它获取要在DataSet中填充DropDown的数据。目前,我正在使用硬编码对象填充下拉列表。但是我想用webmethod返回的数据替换这个硬编码的对象。 客户端(更新1): 问题答案: