2016-11-24 3 views
1

В настоящее время я немного заблокирован этим, и я не вижу его четко.
Объект привязки Hibernate связан с текущим пользователем

Поэтому я надеюсь, что у одного из вас есть хорошая идея, чтобы помочь мне.

Важный код в данный момент:

@Entity 
@Table(name = "T_NOTA_RECIPIENT") 
public class NotaRecipient extends PersistentEntity { 

    @Id 
    @Column(name = "NOTA_RECIPIENT_SID") 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 

    @Column(name = "STATUS", insertable = true, updatable = true) 
    @Enumerated(EnumType.STRING) 
    private Status status = Status.NEW; 

    @ManyToOne 
    @JoinColumn(name = "NOTA_SID", referencedColumnName = "NOTA_SID", nullable = false) 
    private Nota nota; 

    @ManyToOne 
    @JoinColumn(name = "CREATOR_OFFICE_SID", referencedColumnName = "OFFICE_SID", nullable = false) 
    private Office creator; 

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "notaRecipient") 
    private Set<FollowUp> followUps; 

    ... 
} 

Сейчас, на самом деле я не хочу, чтобы загрузить все FollowUp, которые находятся в БД, но только один из текущего пользователя.
Но проблема в том, что я хочу включить FollowUp, чтобы я мог выполнить запрос подкачки базы данных.
Мы используем hibernate, Spring Data и Query DSL с BooleanBuilder для «уточнения» нашего поиска.

Я думал об использовании @Formula, но это должна быть постоянная строка, поэтому я не могу включить в нее текущий userId.

Вторым решением может быть настройка FollowUp как @Transient и извлечение его непосредственно в БД и установка его в службе шахт.
Проблема заключается в том, что я не могу использовать его в качестве фильтра, а затем заказывать его.

@Formula не имеет такой документации, поэтому можно сделать @Transient пользователей и использовать их в @Formula?

Я спросил некоторых коллег, но они не могли мне помочь.

Итак, пришло время спросить здесь. Я могу получить текущего пользователя в API, так что это не проблема.

У кого-нибудь есть альтернативные решения?

+0

Как вы обнаруживаете «текущего пользователя»? – StanislavL

+0

Я извлекаю его с помощью 'SecurityUtil.getUser()', который выберет его из 'SecurityContextHolder' – chillworld

ответ

2

Вы можете определить отображение с выражением

@JoinColumnOrFormula([email protected](value="(SELECT f.id 
               FROM follow_up_table f 
               WHERE f.nota_id=id 
               and f.user_id={USER_ID})", 
referencedColumnName="...") 

А затем добавьте гибернации перехватчик (см the example) и изменить SQL на лету заменить {USER_ID} с реальным значением в

/** 
* Called when sql string is being prepared. 
* @param sql sql to be prepared 
* @return original or modified sql 
*/ 
public String onPrepareStatement(String sql); 
+0

. Я почти там, мне просто нужно заставить перехватчик работать с данными весны (и без весенней загрузки) – chillworld

+0

http: // forum.spring.io/forum/spring-projects/data/2323-how-to-use-an-hibernate-interceptor-with-spring – StanislavL

+0

Я вернусь позже, это нормально работает, поэтому я принял его. Просто наша базовая структура борется со мной, но уже спасибо – chillworld

Смежные вопросы