我正在做一些愚蠢的事情,但我無法弄清楚到底是什么。所以我有一個物件用戶,它擁有一個自動用戶和密碼創建者。但在創建時,這是根據用戶輸入的資訊自動設定的。用戶 名稱,因此用戶可以在之后重置自己。
因此,當添加用戶時,名稱和姓氏應該創建用戶并通過。但是我的測驗一直將其設定為空。
JPA 應該能夠以某種方式加載它。無需使用任何 @post.. 方法。每次創建物件時都必須設定用戶和通行證,但是當有人創建用戶時不能輸入它們。--> 如果我在建構式中添加這兩個,并制作一個不包含任何欄位來填寫用戶名和密碼的表單(盡管使用所有其他欄位),它會與受保護的建構式一起使用嗎?
@Entity
@Table(name = "gebruikers")
@NamedEntityGraph(name = "Gebruiker.metConsigatiebonSet",
attributeNodes = @NamedAttributeNode("consignatiebonSet"))
public class Gebruiker {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private long idgebruikers;
private String voornaam;
private String naam;
private String mail;
private boolean mailOk;
private String gebruikersnaam;
private String pass;
private String telefoonNr;
private String straat;
private String huisnummer;
private String postcode;
private String gemeente;
@Enumerated(EnumType.STRING)
private Gebruikersrol rol;
private String extraOpmerking;
@OneToMany @JoinColumn(name = "consignatiebonId")
//@OrderBy(attribute1, attribute2,..
private Set<Consignatiebon> consignatiebonSet;
public Gebruiker(String voornaam, String naam, String mail, boolean mailOk,
String telefoonNr, String straat, String huisnummer, String postcode, String gemeente,
Gebruikersrol rol, String extraOpmerking) {
this.voornaam = voornaam;
this.naam = naam;
this.mail = mail;
this.mailOk = mailOk;
//the two below keep getting set as null
this.gebruikersnaam = makeUser(naam, voornaam);
makePass(naam, voornaam);
this.telefoonNr = telefoonNr;
this.straat = straat;
this.huisnummer = huisnummer;
this.postcode = postcode;
this.gemeente = gemeente;
this.rol = rol;
this.extraOpmerking = extraOpmerking;
this.consignatiebonSet = new LinkedHashSet<>();
}
protected Gebruiker() {};
/*logic to determine input*/
public String makeUser(String naam, String voornaam) {
var gebruiker = new StringBuilder(naam);
gebruiker.append(".").append(voornaam);
return String.valueOf(gebruiker);
}
public void makePass(String naam, String voornaam) {
var pass = naam voornaam;
this.pass = pass;
}
/*getters*/
public long getIdgebruikers() {
return idgebruikers;
}
public String getVoornaam() {
return voornaam;
}
public String getNaam() {
return naam;
}
public String getMail() {
return mail;
}
public boolean isMailOk() {
return mailOk;
}
public String getGebruikersnaam() {
return gebruikersnaam;
}
public String getPass() {
return pass;
}
public String getTelefoonNr() {
return telefoonNr;
}
public String getStraat() {
return straat;
}
public String gethuisnummer() {
return huisnummer;
}
public String getPostcode() {
return postcode;
}
public String getGemeente() {
return gemeente;
}
public Gebruikersrol getRol() {
return rol;
}
public String getExtraOpmerking() {
return extraOpmerking;
}
/*mogelijkheid om consignatiebonnen in te voegen*/
public Set<Consignatiebon> getConsignatiebonSet() {
return Collections.unmodifiableSet(consignatiebonSet);
}
public boolean add(Consignatiebon bon) {
if (bon == null) {
throw new NullPointerException();
}
return consignatiebonSet.add(bon);
}
}
uj5u.com熱心網友回復:
預設這些值的邏輯在您的建構式中,但您正在使用 JPA(通過 Spring Data JPA)加載物體。但是 JPA 使用您的無引數建構式,因此有問題的代碼永遠不會被執行。
您可以將用于預設此值的邏輯放在物體上的生命周期方法中,如下所示:
@PostLoad
public void initDefaults() {
this.gebruikersnaam = makeUser(naam, voornaam);
makePass(naam, voornaam);
}
有關 JPA 事件的更多資訊,請參閱:https ://www.baeldung.com/jpa-entity-lifecycle-events
請注意,您可能希望添加檢查值是否已設定,因此您不會覆寫它們。
uj5u.com熱心網友回復:
應用程式試圖從引數化建構式呼叫以下兩個方法。JPA 將呼叫無引數建構式來創建物件,因此您將獲得空值。
this.gebruikersnaam = makeUser(naam, voornaam);
makePass(naam, voornaam);
通過無引數呼叫它們可以解決問題。
uj5u.com熱心網友回復:
答:JPA 不能使用邏輯來更正物體本身中的 db 輸入。我應該把這個邏輯放在我的服務或前端應用程式中。根據 db-values 確定值可以在 entity 中設定,但不能放在 db-value 中。例如,我可以設定一個吸氣劑:
getUsername() {
return name "." firstname;
}
但這不會在 de db 中設定用戶名。
Jpa 物體指定表/物體,它不確定如何創建物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/447660.html
上一篇:如何根據數字對物件陣列進行排序?
