2017-09-17 3 views
0

私は他の抽象クラスを継承するJPAエンティティを持っています。私はsetterとgetterを書くのを避けるために@Dataを使いたいが、私のequalsメソッドとhashcodeメソッドは存在する。ロンボク - イコールとハッシュコードが実装されている場合の@Dataによる警告

私は警告しますが、私はいけないと思う:

@Data 
@Entity 
public class User extends AbstractAuditingEntity implements Serializable { 

    .... 

    @Override 
    public boolean equals(Object o) { 
     ... 
    } 

    @Override 
    public int hashCode() { 
     ... 
    } 
} 

私は@Dataに@EqualsAndHashCode(callSuper = false)をさらに追加し

は、私が手に:私のUserクラスで

server\entity\User.java:20: warning: Generating equals/hashCode implementation but without a call to superclass, even though this class does not extend java.lang.Object. If this is intentional, add '@EqualsAndHashCode(callSuper=false)' to your type. 
@Data 
^ 

server\entity\User.java:21: warning: Not generating equals and hashCode: A method with one of those names already exists. (Either both or none of these methods will be generated). 
@EqualsAndHashCode(callSuper = false) 
+1

(これはあなたの例外または警告メッセージを回避します)。あなたは何を理解していますか? –

+0

@RCメッセージは、 "スーパークラスへの呼び出しなしでequals/hashCodeの実装を生成する"です。私の理解は、メソッドが実装されているときに生成されないので、これが私を混乱させるということです。 –

+0

@RC。彼らは明白ですが、その行動は間違っているようです。 'equals'と' hashCode'が手動で定義されているとき、 '@Data'は警告なしでそれらをスキップするだけです。 – maaartinus

答えて

4

@Data@ToStringのショートカットです@EqualsAndHashCode@Getter@Setter、および@RequiredArgsConstructorである。あなただけ@Getter@Setterをしたいので、なぜあなたはちょうどそれらを使用していない、私は失礼なことしたくないけど、メッセージがここにかなり明示されている

@Entity 
@Getter 
@Setter 
public class User extends AbstractAuditingEntity implements Serializable 
    ... 

} 
+0

良い点ですが、それでもなぜ@Dataがこのように動作するのか不思議です。 –

+0

ロンボクは '@ Data'アノテーションに出会うと、' equals'と 'hashCode'を実装しようとします。ロンボクによるバイナリコードの注入中、JVMは、変更されるクラスに 'equals'メソッドと' hashCode'メソッドがすでに存在するため、不平を言います。 –

+0

@KrzysztofKotそして、あなたは正しいと思います。[このコメント](https://stackoverflow.com/questions/46261314/lombok-warning-with-data-when-equals-and-hashcode-are-implemented#comment79495674_46261362 ) 間違っている。これはバグです:https://github.com/rzwitserloot/lombok/issues/1078 – maaartinus

関連する問題