Использование представления в качестве таблицы соединения с Hibernate - PullRequest
3 голосов
/ 16 марта 2011

У меня есть две сущности, к которым я хочу присоединиться через общую строку. Я создал представление, которое хочу использовать в качестве таблицы соединения. Это все работает нормально, за исключением случаев, когда я пытаюсь удалить объект. Затем Hibernate пытается удалить из этого представления, что, конечно, не удается. Используемая база данных - MySQL.

Итак, у меня есть

@Entity
public class Event {

   ...
   String productId;
   Date eventDatetime;
   ...
}

@Entity
public class Stock {
   ...
   String productId;
   ...
}

Я создал представление в MySQL

DROP VIEW IF EXISTS EVENT_STOCK_VIEW;
create view EVENT_STOCK_VIEW AS
SELECT EVENT.EVENT_ID, STOCK.STOCK_ID 
FROM EVENT, STOCK 
where STOCK.PRODUCT_ID = EVENT.PRODUCT_ID;

в Событии, которое я добавил:

@ManyToOne(fetch=FetchType.LAZY)
@JoinTable(name="EVENT_STOCK_VIEW",
    joinColumns=@JoinColumn(name="EVENT_ID"),
    inverseJoinColumns=@JoinColumn(name="STOCK_ID",updatable=false,insertable=false))
public Stock getStock(){
    return this.stock;
}

и на складе:

@OneToMany(fetch=FetchType.LAZY)
    @JoinTable(name="EVENT_STOCK_VIEW",
    joinColumns=@JoinColumn(name="STOCK_ID",updatable=false,insertable=false),       inverseJoinColumns=@JoinColumn(name="EVENT_ID",updatable=false,insertable=false))
    @OrderBy("eventDatetime DESC")
    public List<Event> getEvents(){
        return events;
}

Я немного погуглил и нашел этот сайт . Но решение на самом деле не очень хорошее (вы должны использовать сущность между акцией и событием).

Есть ли другие решения?

Я мог бы использовать Hibernate Interceptor и переопределить onPrepareStatement (String sql) и проверить, содержит ли строка SQL delete из EVENT_STOCK_VIEW и вернуть пустую команду. Ясно, что хак, который я стараюсь избегать.

1 Ответ

0 голосов
/ 16 марта 2011

Разве вы не можете сделать это без таблицы соединений вообще? Насколько я понимаю, ваши отношения эффективно доступны только для чтения, поэтому следующий подход должен работать нормально:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "productId", 
    referencedColumnName = "productId", insertable = false, updateable = false)
public Stock getStock(){
    return this.stock;
}

...

@OneToMany(fetch=FetchType.LAZY, mappedBy = "stock")
@OrderBy("eventDatetime DESC") 
public List<Event> getEvents(){
    return events;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...