2016-04-03 17 views
0

Im Implementieren Hibernate ORM in meinem Java-Projekt. Ive heruntergeladen Quelle von github Ive kompiliert Hibernate-Maven-Web in Proben enthalten. Nehmen wir nun an, ich möchte in einer der Implementierungen überladen Methode Zum Beispiel CitizenDAOImpl.java Vor meinen Änderungen sah es so aus.Hibernate generische Dao Überladung removeById

package sample.googlecode.genericdao.oldworld.dao; 

import org.springframework.stereotype.Repository; 

import sample.googlecode.genericdao.oldworld.model.Citizen; 

/** 
* <p> 
* This is the implementation of the Citizen DAO. You can see that we don't 
* actually have to implement anything, it is all inherited from GenericDAOImpl 
* through BaseDAO. We just specify the entity type (Citizen) and its identifier 
* type (Long). 
* 
* <p> 
* The @Repository allows Spring to recognize this as a managed component (so we 
* don't need to specify it in XML) and also tells spring to do DAO exception 
* translation to the Spring exception hierarchy. 
* 
* @author dwolverton 
* 
*/ 
@Repository 
public class CitizenDAOImpl extends BaseDAO<Citizen, Long> implements CitizenDAO { 


} 

Alles, was ich tat, war, außer Kraft setzen removeById, die einfach super Klasse nennen. Später im Plan, um einige ecrypt Funktionalität hinzuzufügen, so ID wird alle verschlüsselt werden.

package sample.googlecode.genericdao.oldworld.dao; 

import org.springframework.stereotype.Repository; 

import sample.googlecode.genericdao.oldworld.model.Citizen; 

/** 
* <p> 
* This is the implementation of the Citizen DAO. You can see that we don't 
* actually have to implement anything, it is all inherited from GenericDAOImpl 
* through BaseDAO. We just specify the entity type (Citizen) and its identifier 
* type (Long). 
* 
* <p> 
* The @Repository allows Spring to recognize this as a managed component (so we 
* don't need to specify it in XML) and also tells spring to do DAO exception 
* translation to the Spring exception hierarchy. 
* 
* @author dwolverton 
* 
*/ 
@Repository 
public class CitizenDAOImpl extends BaseDAO<Citizen, Long> implements CitizenDAO { 

    @Override 
    public boolean removeById(java.io.Serializable id) { 
     return super.removeById(id); 
    } 
} 

wenn ich laufe mvn sauber installieren es gibt Fehler mich

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3. 
1:compile (default-compile) on project hibernate-maven-web: Compilation failure 
[ERROR] /C:/Dev/spike/hibernate-maven-web/src/main/java/sample/googlecode/generi 
cdao/oldworld/dao/CitizenDAOImpl.java:[26,24] name clash: removeById(java.io.Ser 
ializable) in sample.googlecode.genericdao.oldworld.dao.CitizenDAOImpl and remov 
eById(ID) in com.googlecode.genericdao.dao.hibernate.GenericDAO have the same er 
asure, yet neither overrides the other 
[ERROR] -> [Help 1] 
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e swit 
ch. 
[ERROR] Re-run Maven using the -X switch to enable full debug logging. 
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please rea 
d the following articles: 
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureExc 
eption 

Ich verstehe, dass seine zweideutigen Ruf und beide BaseDAO und CitizenDAO erben GenericADO an einem gewissen Punkt. Was ist eine gute Lösung in diesem Fall? Dank

Antwort

0

Eigentlich Ihre Methode, um die übergeordnete Klasse Methode nicht außer Kraft setzen, sollten Sie Long id statt Serializable id als Parameter verwenden, um sie außer Kraft gesetzt werden.

Die Oberklasse ist eine begrenzte generische Klasse, da es ID extends Serializable Beschränkung auf generische ID-Typ hat. Hinweis: Generische Informationen werden nicht in der Laufzeitumgebung gespeichert und würden gelöscht. Es ist nur eine Kompilierzeit Information. Einzelheiten finden Sie unter https://docs.oracle.com/javase/tutorial/java/generics/erasure.html.

Hier überschreibt Ihre benutzerdefinierte Methode die Superklassenmethode nicht, außerdem sind beide Methoden generisch und haben die gleiche Löschung. So würden diese Methoden in der Laufzeit nach dem Löschen die gleiche Signatur haben und JVM wäre verwirrt, welche man anruft. Deshalb schlägt der Compiler mit Fehler fehl.

+0

Danke für den Kommentar. Ich bin irgendwie von C++ Welt, also würde ich eine Art virtuelle Vererbung annehmen, um manuell Methode in der Laufzeit zu wählen. Was tun wir in solch einem Fall in Java? – AlexS

+0

Warum brauchen Sie hier "Serializable" Typ auf ID? Entsprechend der Klassendefinition muss es "Long" sein. Wenn Sie einen anderen ID-Typ benötigen, sollten Sie eine neue Klasse erstellen, die 'BaseDAO ' erweitert. Wenn Sie eine Methode benötigen, die 'Serializable'-ID in der aktuellen Klasse akzeptiert, können Sie einen anderen Methodennamen wählen (und vergessen Sie nicht,' @ Override'-Annotation in diesem Fall zu entfernen). Aber so habe ich Zweifel an der Notwendigkeit der Methode, weil sie ziemlich zerbrechlich ist. Sie müssen Typen manuell umwandeln und fangen 'ClassCastException' in Runtime ab, wenn Sie etwas anderes als' Long' übergeben. –

+0

Ive änderte es zu Long, das Problem bleibt bestehen. – AlexS