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
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
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. –
Ive änderte es zu Long, das Problem bleibt bestehen. – AlexS