为什么JPA的Transient注解在Target中有方法?

3

你可以通过getter方法或字段访问瞬态属性,这就是它存在的原因。 - Saravana
允许在方法上使用它有什么意义?仅允许在字段上使用不足以满足需求吗? - user2906555
不,你可以使用反射或getter方法编程来访问字段。 - Saravana
这与JPA无关,只是基本的Java注解。 - Neil Stockton
3个回答

2
在JPA实体中,您可以对字段或方法(getter)进行注释。注释@Id规定了这一点,这意味着如果您在字段上放置@Id,那么所有的注释都应该放在字段上,但是如果您将其放在例如@Id Long getId()上,则其他注释应该跟随。这就是为什么@Transient也可以放在方法上的原因。
例如,如果您有以下内容
@Id
private Long id;

@Transient
private String someTransientField;

private Long getId() {
    return this.id;
}

private String getSomeTransientField() {
    return this.someTransientField;
}

如果将@Id保留在字段上,并将@Transient移到private String getSomeTransientField()上,则会将someTransientField视为持久化,因为@Id在字段上,因此预期所有其他注释也应放在字段上。如果将@Transient放在字段上,则someTransientField将被视为瞬态。因此,在方法上使用@Transient的情况是这样的。
private Long id;

private String someTransientField;

@Id
private Long getId() {
    return this.id;
}

@Transient
private String getSomeTransientField() {
    return this.someTransientField;
}

你能提供一个例子,说明在方法上使用@Transient比在字段上更合适吗? - user2906555

0

@Target 注解允许您定义此注解可以使用的位置,例如类、字段、方法等。指示哪些程序元素可以使用注释注释类型的实例进行注释。

@Target(value={METHOD,FIELD}) 表示该注解只能用于类型顶部(通常是方法和字段)。您可以完全省略目标,以便注解可用于类、方法和字段。

在 JPA 中,@Target - 标记另一个注解 @Transient,以限制注解可以应用于哪种 Java 元素。


0

这意味着该注解可以用于Fieldmethod

如果字段被注释,则将使用反射访问该字段。

如果方法(getter)被注释,则将使用getter方法来访问它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接