Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > DAO Implementation


Автор: greef 28.12.2007, 23:27
Доброго времени суток.
Есть 2 таблицы в БД. Связь one-to-many. В обоих нужно редактировать, удалять добавлять данные.
Использую Spring и Hibernate.
Как правильно реализовать DAO класс для связанных сущностей?
Как я понимаю все методы должны быть в одном DAO-классе?

Желательно сылку на примеры, документацию и тд
Заранее спасибо.

Автор: Izabela 29.12.2007, 12:54
Если используать  Hibernate анотации( а не мапинг) тогда
http://java.sun.com/javaee/5/docs/api/javax/persistence/OneToMany.html
и пример
Код
/*************************************************************************
 
@Entity
public class PageSettings extends BaseEntity
{
 
    @OneToMany
    @Cascade({ CascadeType.ALL })
    private Set<ContentValue> contentValues;
    
    @ManyToOne
    private PageCore selectedPageCore;
    
}



Добавлено через 4 минуты и 16 секунд
ну и конечно клас должен иметь get i set  метод
 и еще http://docs.jboss.org/ejb3/app-server/HibernateAnnotations/reference/en/pdf/hibernate_annotations.pdf

Автор: Platon 29.12.2007, 15:12
На самом деле, как я понял, и буду рад если меня поправят. DAO - это что-то типа такого:

Код

public interface Car {
    public Long getRecordId();
    public void setRecordId(Long recordId);
    
    public Model getModel();
    public void setModel(Model model);
}

public interface Model {
    public Long getRecordId();
    public void setRecordId(Long recordId);
    public String getName();
    public void setName(String name);
}

public CarManager {
    public Car getCar(Long id);
    public void removeCar(Long id);
    public void removeCar(Car car);
    public Model getModel(Long id);
    public void removeModel(Long id);
    public void removeModel(Model car);
}

//////////////////////////////////////////////////////////

public class MemoryCar implements Car {
    private Model model;

    public Long getRecordId() { return null; }
    public void setRecordId(Long recordId) {}
    
    public Model getModel() { return model; }
    public void setModel(Model model) {this.model = model;}
}

public class MemoryModel implements Model {
    private String name;

    public Long getRecordId() { return null; }
    public void setRecordId(Long recordId) {}
    
    public Name getName() { return name; }
    public void setName(String name) {this.name = name;}
}

public MemoryCarManager implements CarManager {

    private HashSet<Long, Car> cars = new HashSet<Long, Car>();
    private HashSet<Long, Model> models = new HashSet<Long, Model>();

    public Car getCar(Long id) {
        return cars.get(id);
    }
    public void removeCar(Long id) {
        cars.removeKey(id);
    }
    public void removeCar(Car car) {
        cars.remove(car);
    }
    public Model getModel(Long id) {
         return models.get(id);
    }
    public void removeModel(Long id) {
        models.removeKey(id);
    }
    public void removeModel(Model car) {
        models.remove(car);
    }
}

///////////////////////////////////////////////////////////////////////////
@Entity
public class JpaCar implements Car {
    @Id
    @GenerateValue
    private Long recordId;

   @ManyToOne
   private Model model;
    public JpaCar() {
        
    }
    public JpaCar(Long recordId) {
        setRecordId(recordId);
    }

    public Long getRecordId() { return recordId; }
    public void setRecordId(Long recordId) {this.recordId = recordId}
    
    public Model getModel() { return model; }
    public void setModel(Model model) {this.model = model;}
}

public class JpaModel implements Model {
    @Id
    @GenerateValue
    private Long recordId;

   private String name;

    public Long getRecordId() { return recordId; }
    public void setRecordId(Long recordId) {this.recordId = recordId}
    
    public String getName() { return name; }
    public void setName(String name) {this.name = name;}

}

public class JpaCarManager implements CarManager {

    private SessionFactory factory;

    public JpaCarManager(SessionFactory factory) {
        this.factory = factory;
    }

    public Car getCar(Long id) {
        return (Car)factory.createSession().get(JpaCar.class, id);
    }
    public void removeCar(Long id) {
        removeCar(new JpaCar(id));
    }
    public void removeCar(Car car) {
         Session s = factory.createSesson();
         s.startTransaction();
         s.delete(car);
         s.getTransaction().commit();
    }
    public Model getModel(Long id) {
         return (Model)factory.createSession().get(JpaModel.class, id);
    }
    public void removeModel(Long id);
    public void removeModel(Model model) {
         Session s = factory.createSesson();
         s.startTransaction();
         s.delete(model);
         s.getTransaction().commit();
    }
}

Автор: Tony 29.12.2007, 18:59
Dlja kazdoj tablici budet svoj DAO. A lutshe vsego ispolozvat' AOP+serveici(teze samie DAO)

Автор: Platon 29.12.2007, 19:13
Цитата(Tony @  29.12.2007,  19:59 Найти цитируемый пост)
Dlja kazdoj tablici budet svoj DAO

По-моему, Это условие вовсе необзательно, главное чтобы затем можно было без лишних усилий реализовывать DAO интерфейс.
В моем случае, авто и ее модель можно объединить.

Автор: Tony 29.12.2007, 20:55
A esli u tebja 50 tablic ???. V odnom interfase budesh bombit' vsjo a potom implementaciju v odnom klasse delat'. It's sux man..... V tvojom primere eto pokatit. No nado kak pravelno. smile 
 

Автор: Platon 29.12.2007, 21:04
Ткни меня в то место, где написано, что так правильно.

Автор: Tony 29.12.2007, 22:22
Esli u tebja est' dve tablici: customers i persons. budet dva interfejsa. Kone4no ti mozhesh sdelat'  2  implemntacii v odin klass. No za4em. A tak budem 2 klassa: PersonDAOImpl i CustomerDAOImpl. 

Автор: greef 30.12.2007, 00:04
Пример можно увидеть? В случае использования 2 и более классов классов. Параллельно поискал в google, но пока ничего не нашел.
Просто таблицы связаны, вот и интересно как это связь реализуется в DAO классах.


Автор: Tony 30.12.2007, 00:20
Цитата(Tony @ 29.12.2007,  22:22)
Esli u tebja est' dve tablici: customers i persons. budet dva interfejsa. Kone4no ti mozhesh sdelat'  2  implemntacii v odin klass. No za4em. A tak budem 2 klassa: PersonDAOImpl i CustomerDAOImpl.

Prosto u tebja v sping mappinge budet 2 DAO opisano. Vot i vsjo.

Автор: greef 9.1.2008, 00:40
Допустим есть 2 таблицы - гостиницы (Hotels) и категории номеров (Category) и связь one-to-many. Те человек заходит на сайт - выбирает интересующий его отель - получает все категории для данного отеля. Администратор должен иметь возможность удалить, добавить и изменить как отели, так и категории этих отелей.

Будет 2 DAO класса 

1) HotelDAO.java с методами
Код

    public List getHotels();
    public Hotel getHotel(Long hotelId);
    public void saveHotel(Hotel hotel);
    public void removeHotel(Long hoteld);

+ метод для загрузки выбранного отеля + категории номеров для данного отеля (те мы передаем id отеля и в ответ получаем все котегории где id отеля = hotelId)
Код

    public Category getCategory(Long hotelId);


2) CategoryDAO.java - вот тут вопросы появляются. Метод public List getCategories() - не нужен, так как смысла в получения всех категорий нет. Значит останется только 3 метода?
Код

    public Hotel getCategory(Long сategoryId);
    public void saveCategory(Hotel сategory);
    public void removeCategory(Long сategoryId);

Правильно?
Вообщем я окончательно запутался с реализацией dao для множества связанных сущностей. smile  
Прошу помощи!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)