In Controller nur die eingegebene Felder updaten

Liebste Leute,

Ich programmiere diese Projekt nur im zweck von Lernen und brauche eure Hilfe.
ich bin sehr froh, dass ich bei update() soweit geschafft habe, aber mir fehlt noch ein Punkt. also ich möchte real, dass nu die Felder werden updaten die man eingibt und wenn man nichts eingibt werden alte werte übergeben. mein code schaut so aus und bei Passwort funktioniert es aber bei regDate nicht. Wenn man den if Zweig rauslöscht funktioniert nicht mal beim Passwort . ist das so optimal oder gibt bessere Möglichkeit

	public ResponseEntity<String> updateAdmin(@RequestBody Admin admin){
		User adminFromDb = adminDao.getUserByUsername(admin.getUsername());
		if(adminFromDb != null && adminFromDb instanceof Admin){
			/*
			 * Check which fields have changed. Change only fields which are passed from client. 
			 */
			if(admin.getPassword().length() == 0){
				 admin.setPassword( adminFromDb.getPassword());
			 }else if(admin.getRegDate() == null){
				 admin.setRegDate(adminFromDb.getRegDate());
			 }
			adminDao.update(admin);
			return new ResponseEntity<String>("Admin updated", HttpStatus.OK);
		}else{
			return new ResponseEntity<String>("User not exitst or not admin", HttpStatus.INTERNAL_SERVER_ERROR);
		}```

und update in AdminDAOImpl schaut so aus

```@Override
	public void update(User user) {
		this.sessionFactory.getCurrentSession().update(((Admin) user));
	}```


Danke euch vielmals

Was gibt denn admin.getRegDate() zurück? Hat es einen Grund weshalb du einmal auf length() == 0 prüfst und einmal auf == NULL ?

Du kommst zu deiner Überprüfung nach dem RegDate nur wenn du ein Passwort gesetzt hast. Da du im Code siehe Unten ein else if hast

//Prüfe ob das Passwort lenge null hat
			if(admin.getPassword().length() == 0){
//wenn das der fall ist, nehme das alte PW
				 admin.setPassword( adminFromDb.getPassword());
//wenn das nicht der fall ist (pw gesetzt ist) dann teste ob das date null ist
			 }else if(admin.getRegDate() == null){
//ist das der fall, dann setzte das date auf den wert aus der DB
				 admin.setRegDate(adminFromDb.getRegDate());
			 }
			```
Und dann wäre es interessant, was den das admin.getRegDate zurück liefert. wie sieht da die Funktion aus?

meinst du admin.getPassword().length() == 0 ist das schlecht? ich kann auch auf deinem Vorschlag ändern
Also ich habe mehrere Möglichkeit getestet.
zuerst lege ich mit SoapUI admin mit username, Passwort und regDate an
dann möchte ich updaten und Wenn ich username und Passwort eingebe, dann wird alte regDate aufgenommen, aber wenn ich nur username eingebe dann wird nur alte Passwort übernommen und regDate bekommt NULL

Die Lösung, bzw den Fehlerort hatte ich ja schon geschrieben, auch wenn das aus deiner Frage nicht so ersichtlich war.

[QUOTE=CyborgGamma;115887]Du kommst zu deiner Überprüfung nach dem RegDate nur wenn du ein Passwort gesetzt hast. Da du im Code siehe Unten ein else if hast
[/QUOTE]

Nein das musst du nicht ändern, das hat mit deinem Problem nichts zutun, sondern du musst das else aus dem Code löschen, dann wird bei ohne Passwort auch das RegDate auch auf den alten wert gesetzt.


			if(admin.getPassword().length() == 0){

				 admin.setPassword( adminFromDb.getPassword());

			 }else if(admin.getRegDate() == null){ //<-- hier dieses else musst du entfernen, dann wird nicht nur das RegDate auf den alten wert gesetzt, wenn ein Passwort mit übergeben wird.

				 admin.setRegDate(adminFromDb.getRegDate());
			 }
			```

aaa ja Grundlagenfehler. Danke dir

*** Edit ***

[quote=CyborgGamma]Die Lösung, bzw den Fehlerort hatte ich ja schon geschrieben, auch wenn das aus deiner Frage nicht so ersichtlich war.[/quote] diese Post von dir habe ich nicht gelesen gehabt. Weil ich nach EikeB angefangen hatte zu schreiben und nebenbei habe ich mein Code noch getestet, daher dein Post nicht gesehen.
Welche Funktion meinst du?

*** Edit ***

da die Frage schon gestellt ist, hätte ich noch eine Frage.
Also ich möchte das gleiche bei Owner machen. Hat diese Zeile überhaupt den Sinn?
User ownerFromDB = ownerDao.getUserByUsername(owner.getUsername());
bei Admin hat es gut geklappt weil User und Admin gleiche Attribute haben, aber Owner hat noch zusätzliche Attribute. Verliere ich etwas wenn ich bei Admin und Owner so mache?

Admin adminFromDB = adminDao.getUserByUsername(admin.getUsername());```

Kann jedem mal passieren :wink:

Deine neue Frage genau verstehe ich nicht. Wenn dein ownerDao.getUserByUsername() einen Owner zurückliefert, sollte es passen, egal wie viele Felder der Owner hat, so alle passend in dem Dao geladen werden.
Wenn dein ownerDao, das selbe dao wie adminDao ist, dann kann es sein, das es nicht passt, da dort dann ein falsches Objekt zurück geliefert wird

[ot]
@CyborgGamma
wie sieht es allgemein aus, bist du ansprechbar?
PN von Jango gesehen?,
Nachfrage in Posting http://forum.byte-welt.net/java-forum-erste-hilfe-vom-java-welt-kompetenz-zentrum/android/16126-titelbar-hidden-post115833.html#post115833 ?
hier nun einmal von mir versucht[/ot]

Mein model schaut so aus

public  abstract class User 

public class Admin extends User

public abstract class Customer extends User

public class Owner extends Customer

public class VehicleUser extends Customer

Soll ich das Problem so Lösen? Ist das effizient ?

@RequestMapping(method = RequestMethod.PUT, consumes = "application/json")
	public ResponseEntity<String> updateOwner(@RequestBody Owner owner) {
	
		User ownerFromDB =  ownerDao.getUserByUsername(owner
				.getUsername());
		if (ownerFromDB != null && ownerFromDB instanceof Owner) {

			if (owner.getAdress() == null) {
				owner.setAdress(((Customer) ownerFromDB).getAdress());
			}
			if (owner.getBirthday() == null) {
				owner.setBirthday(((Customer) ownerFromDB).getBirthday());
			}


oder so Owner ownerFromDB = (Owner) ownerDao.getUserByUsername(owner .getUsername());

die zweite Variante sieht besser aus, aber noch bisschen unklar alles,
kann es denn sein dass der instanceof-Test nötig wird? beim zweiten verzichtest du darauf, wieso nur beim ersten dabei?

was ist ownerDao, nur ein UserDao in einer speziellen Variable? warum nicht ein einzelnes Dao für das Laden aller User?

wenn unterschiedliche Klassen, wieso gibt dann das ownerDao nicht gleich Owner zurück?
wieso heißt die Methode nicht getOwnerByUsername, beides Vererbungsfragen?

schau dir noch das folgende Beispiel an


    public static void main(String args[])  {
        OwnerDao ownerDao = new OwnerDao();
        Owner owner = null;
        User user = null;

        Owner ownerDB = ownerDao.getByName(owner); // kein Cast
        Owner ownerDB2 = ownerDao.getByName(user); // nicht erlaubt
    }

}

class User  {
    String getName() {
        return null;
    }
}

class Owner extends User {
}

class OwnerDao  extends UserBaseDao<Owner> {
}

class UserDao  extends UserBaseDao<User> {
}

class UserBaseDao<T extends User>  {
    T getByName(T t) {
        String name = t.getName();
        User uDB = null; // laden

        @SuppressWarnings("unchecked")
        T tDB = (T)uDB;
        return tDB;
    }
}

nicht unbedingt nachzubauen, nicht unbedingt überall passend, OwnerDao könnte hier nicht so gut von CustomerDao laden falls das evtl. praktisch ist,
ginge theoretisch mit weiteren Zwischenklassen, class CustomerBaseDao<T extends Customer> extends UserBaseDao<T>

[quote=SlaterB]wieso heißt die Methode nicht getOwnerByUsername, beides Vererbungsfragen?[/quote] ja wegen Vererbung, damit ich gleiche setter und getter Methoden nicht bei Owner und VehicleUser auch nicht habe. Ist das korrekter Zugang?
Ich denke nicht dass ich auf instance of verzichte
Kleine Ausschnitte und möglichst kompakt geschrieben damit ich hier nicht zu viel schreibe , sonst habe ich in meinem code nicht so

	 private String username, password;
         private Date regDate; 
	
	public User(String username, String password, Date regDate) {}```

```@Entity
@Table(name = "ADMIN")
public class Admin extends User{
	public Admin(String username, String password, Date regdate){
		super(username, password,regdate);
	}

	
}
public abstract class Customer extends User {
	
       private String familyname, name, Adress,email,telnumber;
	private Date birthday;
	private Payment payment ;
	
	public Customer(String username, String password, Date regDate,
			String familyname, String name, Date birthday, String adress,
			String email, String telnumber) {}```
```public class Owner extends Customer {
	private List<Vehicle> vehicle = new ArrayList<Vehicle>();
	
	public Owner(String username, String password, Date regDate,
			String familyname, String name, Date birthday, String adress,
			String email, String telnumber) {
	}

	
	}```

public class VehicleUser extends Customer{
private List bookings = new ArrayList();

public VehicleUser(String username, String password, Date regDate,
		String familyname, String name, Date birthday, String adress,
		String email, String telnumber) {}

was meinst du damit?

[quote=SlaterB;116017]was ist ownerDao, nur ein UserDao in einer speziellen Variable? warum nicht ein einzelnes Dao für das Laden aller User?[/quote]

ich habe für jede Klasse DAO-s und DAOImpl

mich wundert sehr dass das nicht funktioniert, da  ownerDao von Objekt Owner ist, warum funktioniert nicht , dass ```User ownerFromDB =  ownerDao.getUserByUsername(owner.getUsername());``` ownerFromDB nicht automatisch Owner ist und untern Cast auf Customer gebraucht wird

```@Controller
@RequestMapping("/owner")
public class OwnerController {
        
	@Autowired
	private OwnerDAO ownerDao;

public ResponseEntity<String> updateOwner(@RequestBody Owner owner) {
		
		User ownerFromDB =  ownerDao.getUserByUsername(owner
				.getUsername());
		if (ownerFromDB != null && ownerFromDB instanceof Owner) {

		/*	if (owner.getAdress() == null) {
				owner.setAdress( ownerFromDB.getAdress());
			}
              */
                 //wird folgende Cast vorgeschlagen
                   if (owner.getAdress() == null) {
				owner.setAdress( ((Customer) ownerFromDB).getAdress());
			}
}

dass Admin von User erbt usw. hast du früher schon gepostet, nicht viel neues durch die Konstruktoren

ownerDao ist von Typ OwnerDAO, das ist nun neu, das hatte ich gefragt,
aber zum Inhalt dieser Klasse, zum Aufbau der Methode getUserByUsername, warum sie User usw. zurückgibt, teils deine eigenen Fragen, könnte evtl. der Quellcode weiterhelfen