Frage

Ich bin etwas chaotisch Code umschreiben, die eine Datenbank verwaltet, und sah, dass der ursprüngliche Programmierer eine Klasse erstellt, wie so in die Datenbank abgebildet:

(Ich habe unnötigen Code entfernt, die keinen Zweck in dieser Frage hat)

@Entity
@Data
@EqualsAndHashCode(callSuper = false, of = { "accessionCode", "header", "date" })
@SuppressWarnings("PMD.UnusedPrivateField")
public class PDBEntry implements Serializable {
    @Id
    @NaturalId
    @NotEmpty
    @Length(max = 4)
    private String accessionCode;

    @NaturalId
    @NotEmpty
    private Date date;

    @NaturalId
    // We allow for the header to be 'null'
    private String header;

    private Boolean isValidDssp;

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastUpdated = new Date(System.currentTimeMillis());

    protected PDBEntry(){}

    public PDBEntry(String accessionCode, String header, Date date){
        this.accessionCode = accessionCode;
        this.header = header;
        this.date = date;
    }
}

Ich bin noch ein Anfänger in dem Ruhezustand und Lombok verwenden, aber dies tun würde nicht die gleiche Sache und würde nicht Lombok automatisch die benötigte Konstruktor für Sie erstellen?

@Entity
@Data
@SuppressWarnings("PMD.UnusedPrivateField")
public class PDBEntry implements Serializable {
    @Id
    @NaturalId
    @NotEmpty
    @NonNull
    @Length(max = 4)
    private String accessionCode;

    @NaturalId
    @NotEmpty
    @NonNull
    private Date date;

    @NaturalId
    // We allow for the header to be 'null'
    private String header;

    private Boolean isValidDssp;

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastUpdated = new Date(System.currentTimeMillis());
}

Auch der ursprüngliche Programmierer dieses Codes sagt er ermöglicht die Header ‚null‘ zu sein, aber er explizit einen Konstruktor erstellt, die einen Wert für Header benötigt. Bin ich etwas fehlt oder ist dies ein wenig widersprüchlich?

War es hilfreich?

Lösung

Hier finden Sie aktuelle @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor .

Das Konstruktor Verhalten von @Data wie @RequiredArgsConstructor ist:

  

@RequiredArgsConstructor erzeugt ein   Konstruktor mit 1 Parameter für jeden   Feld, das eine spezielle Handhabung erfordert.   Alle endgültigen Felder erhalten einen Parameter, wie   auch auf alle Felder, die als gekennzeichnet sind   @NonNull, die nicht initialisiert, wo   sie deklariert sind.

In Anbetracht, dass keine Ihrer Felder sind entweder final oder @NonNull, wird dies in einem Konstruktor ohne Argumente führen. Dies ist jedoch nicht die expressive Möglichkeit, dieses Verhalten zu erreichen.

Was werden Sie wahrscheinlich in diesem Fall wollen, ist ein @NoArgsConstructor (optional mit einem @AllArgsConstructor kombiniert), um eindeutig das beabsichtigte Verhalten zu kommunizieren, wie auch in der Dokumentation angegeben:

  

Bestimmte Java-Konstrukte, wie   Hibernate und der Service Provider   Schnittstelle erfordert einen No-args   Konstrukteur. Diese Anmerkung ist hilfreich   vor allem in Kombination mit entweder   @Data oder einer der anderen Konstruktor   Erzeugen Anmerkungen.

Andere Tipps

Das Bit ist widersprüchlich Sie haben Recht. Ich habe nicht Lombok vor, aber mit Hibernate verwendet, wenn Sie in der Lage sein wollen, eine Bohne zu erstellen und bleiben Sie den Standard-Konstruktor müssen, wie oben angegeben, so weit ich bewusst war. Es verwendet Constructor.newInstance () instanziiert werden neue Objekte.

Hier finden Sie einige Hibernate Dokumentation, die mehr ins Detail geht.

Hibernate Dokumentation

Wenn Sie @data mit einem @NonNull Feld verwenden und wollen noch einen noargs-Konstruktor, könnte Wanna Sie versuchen, alle 3 Anmerkung zu addieren

@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor

Offenbar ein alter IntelliJ Fehler, ich habe Replikation in Eclipse Kepler und lombok v0.11.4

@NoArgsConstructor, 
@RequiredArgsConstructor, 
@AllArgsConstructor

generieren Konstrukteure, die keine Argumente übernehmen, ein Argument pro final / Nicht-Null-Feld oder ein Argument für jedes Feld. Lesen Sie dieses lombok-Projekt

@Data
@RequiredArgsConstructor /*Duplicate method Someclass() in type Someclass*/
@NoArgsConstructor(access=AccessLevel.PRIVATE, force=true)  /*Duplicate method Someclass() in type Someclass*/
@Entity
public class Someclass {      
    @Id
    private  String id;
    private  String name;
    private  Type type; 

    public static enum Type { X , Y, Z}
}

es Feste von Membervariablen machen final

@Data
@RequiredArgsConstructor 
@NoArgsConstructor(access=AccessLevel.PRIVATE, force=true)
@Entity
public class Someclass {

    @Id
    private final String id;
    private final String name;
    private final Type type; 
    public static enum Type { X , Y, Z}
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top