EJB/CMP findby.. findet mehr als einen Eintrag --> Error ??

GartenUmgraben

Erfahrenes Mitglied
Wenn ich in meiner Applikation eine Person durch Eingabe des Namens finden will, klappt es mit der unten stehenden Variante solange, bis ich in der Datenbank mal zwei Personen mit dem gleichen Namen eingebe (Name ist nicht der PK). Dabei würde ja bei "findPersonbyName" mehr als ein Wert zurückgegeben wodurch ein Fehler entsteht.

Es müsste ja irgendwie gehen dass der Rückgabewert eine Art Array ist wobei er dann auch mehrere Einträge verwalten können müsste. Leider weiss ich nicht genau wie ich ein Feld von personLocal - Einträgen anlegen soll. Statt

DB_2.ejb.Server.interfaces.PersonLocal personLocal = personHome.findPersonByName(name);


kann ich ja nicht einfach

Array personLocal = personHome.findPersonByName(name); schreiben ..denke ich mal.

Nur wie gehts dann ?


Code:
public DB_2.ejb.Server.genrated.VO.PersonValue findPersonByName(String name) {

        DB_2.ejb.Server.interfaces.PersonLocalHome personHome = (DB_2.ejb.Server.interfaces.PersonLocalHome) ServiceLocator
                .getServiceLocator().lookup(DB_2.ejb.Server.interfaces.PersonLocalHome.JNDI_NAME,
                        DB_2.ejb.Server.interfaces.PersonLocalHome.class);

        try {
        	
            DB_2.ejb.Server.interfaces.PersonLocal personLocal = personHome.findPersonByName(name);
            Integer personId = personLocal.getId();
            String personName = personLocal.getName();

            DB_2.ejb.Server.genrated.VO.PersonValue personValue = new DB_2.ejb.Server.genrated.VO.PersonValue(personId, name);

            return personValue;

        } catch (FinderException e) {
            e.printStackTrace();
        }

        return null;
    }
 
Re: EJB/CMP findby.. findet mehr als einen Eintrag --> Error

Hallo!

Ist es nach deiner Geschäftslogik überhaupt erlaubt zwei Personen mit dem selben Namen im System zu haben? Wenn nein, solltest du einen Unique Constraint auf das Namens-Feld der Personentabelle in der Datenbank legen...

Wie du eine Collection als Abfrage ergebnis zurück geben kannst findest du hier:
http://www.tutorials.de/tutorials203484.html

Was du am Beispiel dazu noch verändern musst ist folgendes:
Im EntityBean PersonBean fügst du im Class-Doclet folgenden XDoclet Kommentar hinzu:
Code:
* @ejb.finder signature = "Collection findPersonsByNamePattern(java.lang.String namePattern)"
 *             description = "Find Persons by Namepattern" query = "SELECT OBJECT(p) FROM Person AS p WHERE p.name like ?1"

Anschließed gehst du zur Klasse PersonServiceBean und implementierst eine findPersonsByNamePattern Methode ... etwa so:
Code:
  /**
     * @ejb.interface-method view-type = "remote"
     * @param id
     * @param name
     */
    public List findPersonsByNamePattern(String namePattern) {

        PersonLocalHome personHome = (PersonLocalHome) ServiceLocator
                .getServiceLocator().lookup(PersonLocalHome.JNDI_NAME);

        try {
            Collection persons = personHome
                    .findPersonsByNamePattern(namePattern);
            List list = new ArrayList();
            for (Iterator iter = persons.iterator(); iter.hasNext();) {
                PersonLocal personLocal = (PersonLocal)iter.next();
                
                Integer personId = personLocal.getId();
                String personName = personLocal.getName();

                PersonValue personValue = new PersonValue(personId, personName);
                
                list.add(personValue);
            } 

            return list;

        } catch (FinderException e) {
            e.printStackTrace();
        }

        return null;
    }

... anschließend muss natürlich der Build neu durchlaufen...

Im Client arbeitet man damit dann in etwa so:
Code:
List persons = personService.findPersonsByNamePattern("Fo%");
        System.out.println(persons);

HTH,

Gruß Tom
 
Zurück