powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / model dao service resources
14 сообщений из 14, страница 1 из 1
model dao service resources
    #39131690
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проект на Spring.
Пишу Rest на таблицы. Все таблицы однотипные (id, name).

Model:
Код: java
1.
2.
3.
4.
@Entity
@Table(name = "ref_book0")
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class RefBook0 {

Код: java
1.
2.
3.
@Entity
@Table(name = "ref_book1")
public class RefBook1 extends RefBook0 {

Количество таблиц - n.

DAO на первую таблицу:
Код: java
1.
2.
3.
4.
5.
6.
7.
public interface RefBook0DAO {
	public RefBook0 add(RefBook0 refBook);
	public RefBook0 update(long id, RefBook0 refBook);
	public RefBook0 delete(long id);
	public RefBook0 get(long id);
	public List<RefBook0> getAll();
}

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
@Repository
public class RefBook0DAOImpl implements RefBook0DAO {
	@Autowired
	private SessionFactory session;

	@Override
	@Transactional
	public RefBook0 add(RefBook0 refBook) {
		session.getCurrentSession().save(refBook);
		return refBook;
	}
...


Service:
Код: java
1.
2.
3.
4.
5.
6.
7.
public interface RefBook0Service {
    public RefBook0 add(RefBook0 refBook);
    public RefBook0 update(long id, RefBook0 refBook);
    public RefBook0 delete(long id);
    public RefBook0 get(long id);
    public List<RefBook0> getAll();  
}

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
@Service
@Transactional
public class RefBook0ServiceImpl implements RefBook0Service {

	@Autowired
	private RefBook0DAO refBookDao;

	@Override
	public RefBook0 add(RefBook0 refBook) {
        return refBookDao.add(refBook);
	}
...


Resources:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
@RestController
@RequestMapping("/rest/refbook0")
public class RefBook0Resource {
    
	private RefBook0Service refBookService;

    @Autowired
    public RefBook0Resource(RefBook0Service refBookService) {
        this.refBookService = refBookService;
    }

    @RequestMapping(method = RequestMethod.GET)
    @PreAuthorize("permitAll")
    public ResponseEntity<List<RefBook0>> getAll() {
    	List<RefBook0> refBook = refBookService.getAll();
        if(refBook.isEmpty()){
            return new ResponseEntity<List<RefBook0>>(HttpStatus.NO_CONTENT);
        }
        return new ResponseEntity<List<RefBook0>>(refBook, HttpStatus.OK);
    }

...


Вопрос:
Как лучше/правильней всего реализовать Rest на вторую и следующие таблицы?
...
Рейтинг: 0 / 0
model dao service resources
    #39131693
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не пора ли открыть для себя Spring Data?
...
Рейтинг: 0 / 0
model dao service resources
    #39131818
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wvetal,

А если по-старинке делать, то Generic DAO
...
Рейтинг: 0 / 0
model dao service resources
    #39131837
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНе пора ли открыть для себя Spring Data?
+ Spring-Rest
:-)
...
Рейтинг: 0 / 0
model dao service resources
    #39131889
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mad_nazgul+ Spring-Rest
:-)
Оно как-то иначе называется наверное? Spring REST выродился в Spring MVC в итоге. Но там сейчас есть какая-то фигня, чтобы замапить REST на CRUD репозиторий напрямую.
...
Рейтинг: 0 / 0
model dao service resources
    #39131920
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczmad_nazgul+ Spring-Rest
:-)
Оно как-то иначе называется наверное? Spring REST выродился в Spring MVC в итоге. Но там сейчас есть какая-то фигня, чтобы замапить REST на CRUD репозиторий напрямую.

Это?
...
Рейтинг: 0 / 0
model dao service resources
    #39131960
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mad_nazgul,

Да, REST in Spring Data
...
Рейтинг: 0 / 0
model dao service resources
    #39132111
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут примеры :
https://github.com/spring-projects/spring-data-examples/tree/master/rest

а так да подход верный : можно еще создать свою аннотацию : проаннотировать ей нужные ентити и при старте создавать на основе этой аннотации репозитарии ...

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
@Service
public class FactoryRepository {
    
    @Autowired
    private ApplicationContext appContext;
    
    @Autowired 
    @PersistenceContext(unitName="entityManagerFactory")
    private EntityManager entityManager;  
    
    
    private RepositoryFactorySupport support;
    
    @PostConstruct
    public void init() {
          support = new JpaRepositoryFactory(entityManager);
    } 
   
    public  AbstractRepository getRepositoryByClassName(String className) {
        String[] beanNames = appContext.getBeanNamesForType(AbstractRepository.class);
        for (String beanName : beanNames) {
            if(beanName.startsWith(className.toLowerCase())){
                Object bean = appContext.getBean(beanName);
                support.getRepository(bean.getClass());
            }
        }

        return null;
    }
}




или так

http://java.dzone.com/articles/customizing-spring-data-jpa

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
/**
 * 
 */
@SuppressWarnings("unchecked")
@NoRepositoryBean
public class GenericRepositoryImpl<T, ID extends Serializable>
        extends SimpleJpaRepository<T, ID> implements AbstractRepository<T, ID>, Serializable {

    private static final long serialVersionUID = 1L;

    private final JpaEntityInformation<T, ?> entityInformation;
    private final EntityManager em;
   // private final DefaultPersistenceProvider provider;

    private Class<?> springDataRepositoryInterface;

    public Class<?> getSpringDataRepositoryInterface() {
        return springDataRepositoryInterface;
    }

    public void setSpringDataRepositoryInterface(
            Class<?> springDataRepositoryInterface) {
        this.springDataRepositoryInterface = springDataRepositoryInterface;
    }

    /**
     * Creates a new {@link SimpleJpaRepository} to manage objects of the given
     * {@link JpaEntityInformation}.
     *
     * @param entityInformation
     * @param entityManager
     */
    public GenericRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager, Class<?> springDataRepositoryInterface) {
        super(entityInformation, entityManager);
        this.entityInformation = entityInformation;
        this.em = entityManager;
      //  this.provider = DefaultPersistenceProvider.fromEntityManager(entityManager);
        this.springDataRepositoryInterface = springDataRepositoryInterface;
    }

    /**
     * Creates a new {@link SimpleJpaRepository} to manage objects of the given
     * domain type.
     *
     * @param domainClass
     * @param em
     */
    public GenericRepositoryImpl(Class<T> domainClass, EntityManager em) {
        this(JpaEntityInformationSupport.getMetadata(domainClass, em), em, null);
    }

    public <S extends T> S save(S entity) {
        if (this.entityInformation.isNew(entity)) {
            this.em.persist(entity);
            flush();
            return entity;
        }
        entity = this.em.merge(entity);
        flush();
        return entity;
    }

    public T saveWithoutFlush(T entity) {
        return super.save(entity);
    }

    public List<T> saveWithoutFlush(Iterable<? extends T> entities) {
        List<T> result = new ArrayList<T>();
        if (entities == null) {
            return result;
        }

        for (T entity : entities) {
            result.add(saveWithoutFlush(entity));
        }
        return result;
    }
}



твой контроллер

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
@Controller
@RequestMapping(value = "/rest/api")
public class RestController {

    @Autowired
    FactoryService service;

    @RequestMapping(method = RequestMethod.GET,
            produces = {MediaType.APPLICATION_JSON_VALUE},
            value = "/{clazz}/{id}")
    public ResponseEntity<String> id(@PathVariable("clazz") String clazz, @PathVariable(value = "id") Long id) {

        AbstractService ss = service.getServiceByClassName(clazz);
        Object au = ss.findOne(id);
        System.out.println(au);
        Result<Object> re = ResultFactory.getResult(au);

        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-type", "application/json;charset=UTF-8");
        return new ResponseEntity<>(re.toString(), headers, HttpStatus.OK);
    }

    /**
     * http://www.youtube.com/watch?v=wylViAqNiRA 
     * TODO получение объекта по его
     * классу и внесение изменений в базу
     *
     * @param id
     * @return
     */
    @RequestMapping(method = RequestMethod.POST, value = "/{id}")
    @ResponseBody
    public ResponseEntity<String> post(@PathVariable("id") Long id) {
        //User u = userService.findOne(id);

        // Result<User> re = ResultFactory.getResult(u);
        return new ResponseEntity<>(" ", HttpStatus.OK);
    }

    @RequestMapping(method = RequestMethod.GET,
            produces = {MediaType.APPLICATION_JSON_VALUE},
            value = "/{clazz}/findall")
    @ResponseStatus(HttpStatus.FOUND)
    @ResponseBody
    /**
     * автоматически преобразуется в json через jackson
     */
    public List<User> findAll(
            @PathVariable("clazz") String clazz
            //@PathVariable("method") String method
    ) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        
       
        AbstractService ss = service.getServiceByClassName(clazz);
        //Class noparams[] = {};
        //Method imethod =  ss.getClass().getDeclaredMethod(method, noparams);
       //  return (List<User>) imethod.invoke(ss, null);

        
        return ss.findAll();

    }

    
    
 
}



или через

Код: java
1.
2.
3.
4.
@NoRepositoryBean
public interface AbstractRepository<T , ID extends Serializable>  extends JpaRepository<T, ID>,JpaSpecificationExecutor<T>{
    
}
...
Рейтинг: 0 / 0
model dao service resources
    #39132196
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответы.

Почитал про Spring Data, посмотрел примеры.
Сделал некоторые предположения:
1)
Код: java
1.
2.
3.
4.
@RepositoryRestResource(collectionResourceRel = "refbook0", path = "refbook0") 
@PreAuthorize("permitAll")  
@Repository
public interface RefBook0Repository extends CrudRepository<RefBook0, Long> { 

Вот если сделать так, то означает ли аннотация @RepositoryRestResource - что в таком случае можно обойтись(не реализовывать) без слоев service и resources? И можно будет получить данные по localhost:8080/myapp/refbook0 ?

2) Смотрю на интерфейсы PagingAndSortingRepository, CrudRepository... Если для таблицы основное - это CRUD + если, например, в таблице миллион записей, и мне не нужно тянуть все(хочу чтоб Pagination работало), какой интерфейс(ы) лучше применить?

3) Как будет работать HATEOAS, то есть добавление линков?

4) Думал, что если добавлю @Repository для
Код: java
1.
public interface RefBook0Repository extends CrudRepository<RefBook0, Long> {

То в сервисе смогу инжекнуть RefBook0Repository - но получаю
No found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency
Как правильно сделать, чтоб был виден этот бин?
...
Рейтинг: 0 / 0
model dao service resources
    #39132734
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wvetal
Код: java
1.
public interface RefBook0Repository extends CrudRepository<RefBook0, Long> {

То в сервисе смогу инжекнуть RefBook0Repository - но получаю
No found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency
Как правильно сделать, чтоб был виден этот бин?

Правильно.
Нужно в spring-config добавить
Код: xml
1.
<jpa:repositories base-package="пакет с которого нужно начинать поиск интерфейсов для jpa" entity-manager-factory-ref="ваш EMF" />
...
Рейтинг: 0 / 0
model dao service resources
    #39132778
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лучше сразу взять готовое решение

http://projects.spring.io/spring-hateoas/
...
Рейтинг: 0 / 0
model dao service resources
    #39132788
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wvetal4) Думал, что если добавлю @Repository для
Код: java
1.
public interface RefBook0Repository extends CrudRepository<RefBook0, Long> {

То в сервисе смогу инжекнуть RefBook0Repository - но получаю
No found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency
Как правильно сделать, чтоб был виден этот бин?


самое простое - документация (SimpleJpaRepository JpaRepositoryFactory RepositoryFactorySupport)- раздел как создать простой инстантц интерфейса рапозитарий .

+ примеры (смотритпе тесты на ГИТХАБЕ)

http://docs.spring.io/spring-data/data-commons/docs/1.6.1.RELEASE/reference/html/repositories.html


https://github.com/spring-projects/spring-data-jpa-examples/blob/master/spring-data-jpa-example/src/test/java/org/springframework/data/jpa/example/repository/basics/BasicSample.java

для более навернутых sql

http://www.querydsl.com/static/querydsl/3.6.3/reference/html_single/


Универсально ,,то о чем вы спросили будет так :

JpaRepository,JpaSpecificationExecutor

и далее использовать

findAll(Specification<T> s, Pageable pgbl) )

где у вас будет и Pageable - сортировка и фильтр на кол-во

и Specification - это вообще любой запрос !!!! фактически это лямда функция (смотрите java 8)


Код: java
1.
2.
3.
4.
5.
6.
7.
@NoRepositoryBean
public interface AbstractRepository<T , ID extends Serializable> extends JpaRepository<T, ID>,JpaSpecificationExecutor<T>{
}

public interface UserRepository extends AbstractRepository<User, Long>{
User findOneByLogin(String login);
}



а так для общего развития смотрите


CQRS - надо сказать что идея идеального репозитария уже реализована - и это interface JpaSpecificationExecutor
конкретно я вижу это в методе
Page<T> findAll(Specification<T> spec, Pageable pageable);
но в приложенных документа есть более абстрактная реализация :
в статье как раз это демонстритентся через (Repository v4.0)
public class AccountRepository : IRepository<Account>
{
public IEnumerable<Account> GetAccounts(IFetchStrategy<Account>[] fetchStrategies,ISpecification<Account>[] specifications)
{
// ...
}


Курите статью http://blog.byndyu.ru/2014/07/command-and-query-responsibility.html :)

http://habrahabr.ru/post/146429/
...
Рейтинг: 0 / 0
model dao service resources
    #39132792
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
model dao service resources
    #39132842
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mad_nazgul, Atum1,

Спасибо, изучаю материал.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / model dao service resources
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]