2015-01-04 7 views
3

Я использую Spring Data JPA и Hibernate как поставщик. Я создал несколько классов репозитория, которые распространяются на класс JPARepository<Entity,Serializable>. Я терпеть неудачу в тот момент, когда я получаю одно сущность, которое приносит прикрепленные/связанные объекты вместе с ним! которые либо подключены через @OneToOne@OneToMany и т. д. Как избежать сбора связанных объектов?
Я пробовал с @OneToMany(fetch=FetchType.LAZY) и т.д., но все равно не повезло. Ниже приведены мои Java-код:
RepositoryКак реализовать ленивую загрузку с использованием данных Spring JPA (JPARepository)?

public interface TicketRepository extends JpaRepository<Ticket, Integer>{ 

} 

Билет Entity

@Entity 
@Table(name = "tbl_tickets") 
public class Ticket { 

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

    @Column(name = "customer", nullable = false, length = 256) 
    private String customer; 


    @OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY) 
    @JoinColumn 
    private User creator; 

    // ... other properties 
} 

Сервис

@Service 
public class TicketService { 

    public Ticket save(Ticket obj,String id) { 
     User user = userService.findById(Integer.valueOf(id)); 
     obj.setCreator(user); 
     Ticket savedTicket = ticketRepository.save(obj); 
    } 
} 

savedTicket всегда выбирает пользователя entit и я не хочу этого делать. Как я мог это достичь?
enter image description here

Благодаря

+0

Ваш код извлекает пользовательский объект и устанавливает «создатель» в билете, и вы ожидаете, что создатель будет пустым? –

+0

@RC. вы правы, из-за сопоставления я должен установить это так! может быть, я неправильно настроен! любая идея по отображению части? – agpt

+0

есть проблемы с ленивым изложением OneToOne (возможно, решенным в ответе Харшала Патила ниже), однако у вас не должно быть проблем с ленивым изложением OneToMany (fetch = FetchType.LAZY). Если поле инициализируется такой аннотацией, это может означать, что вы обращаетесь к объекту, аннотируемому с @OneToMany (который должен быть набором или списком и т. Д.) Где-то до этого. –

ответ

0

Получить Ленивую нагрузка работает на обнуляемом отображении один-к-одному, вам нужно позволить зимует сделать Compile time instrumentation и добавить @LazyToOne(value = LazyToOneOption.NO_PROXY) по отношению к один-к-одному.

@OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY) 
@JoinColumn 
@LazyToOne(value = LazyToOneOption.NO_PROXY) 
private User creator; 

Надеюсь, что это сработает.

+0

Извините, для более позднего ответа я добавил изменения, предложенные вами, но он говорит: «Не удалось инициализировать прокси - нет сеанса» – agpt

+0

@agpt Добавить трансакционную аннотацию по методу, в котором вы извлекаете создателя. –

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