咱們都知道hibernate3能夠調用存儲過程或函數,可是有必定的限制(具體能夠查看hibernate官方手冊)。
據我分析這段代碼應該是用來分析字符串是不是調用存儲過程或函數的語句。
解決方法:
1.不要在表或列中,出現"call"字樣
2.用Criteria來代替hql語句
:雙向一對多關係,一是關係維護端(owner side),可能是關係被維護端(inverse side)。在關係被維護端須要經過@JoinColumn創建外鍵列指向關係維護端的主鍵列。 app
publicclass
Order
implements
Serializable {
private
Set<OrderItem> orderItems
=
new
HashSet<OrderItem>();
。。。。
@
OneToMany
(mappedBy=
"order"
,cascade = CascadeType.
ALL
, fetch = FetchType.
LAZY
)
@
OrderBy
(value =
"id ASC"
)
public
Set<OrderItem> getOrderItems() {
return
orderItems
;
}
}
publicclass
OrderItem
implements
Serializable {
private
Order
order
;
。。。。
@
ManyToOne
(cascade=CascadeType.
REFRESH
,optional=
false
)
@
JoinColumn
(name =
"order_id"
)
public
Order getOrder() {
return
order
;
}
}
@OrderBy(value = "id ASC")
指明加載
OrderItem
時按
id
的升序排序
@OneToMany
的屬性
:
1>targetEntity
定義關係類的類型,默認是該成員屬性對應的類類型,因此一般不須要提供定義。
2>mappedBy
定義類之間的雙向關係。若是類之間是單向關係,不須要提供定義,若是類和類之間造成雙向關係,咱們就須要使用這個屬性進行定義,不然可能引發數據一致性的問題。
該屬性的值是「多」方class裏的「一」方的變量名
3>cascade
該屬性定義類和類之間的級聯關係。定義的級聯關係將被容器視爲對當前類對象及其關聯類對象採起相同的操做,並且這種關係是遞歸調用的。舉個例子:
Order
和
OrderItem
有級聯關係,那麼刪除
Order
時將同時刪除它所對應的
OrderItem
對象。而若是
OrderItem
還和其餘的對象之間有級聯關係,那麼這樣的操做會一直遞歸執行下去。
cascade
的值只能從
CascadeType.PERSIST
(級聯新建)、
CascadeType.REMOVE
(級聯刪除)、
CascadeType.REFRESH
(級聯刷新)、
CascadeType.MERGE
(級聯更新)中選擇一個或多個。還有一個選擇是使用
CascadeType.ALL
,表示選擇所有四項。
4>fatch
可選擇項包括:
FetchType.EAGER
和
FetchType.LAZY
。前者表示關係類
(
本例是
OrderItem
類
)
在主類
(
本例是
Order
類
)
加載的時候同時加載,後者表示關係類在被訪問時才加載。默認值是
FetchType.LAZY
。
@JoinColumn(name = "order_id")
註釋指定OrderItem映射表的order_id列做爲外鍵與Order 映射表的主鍵列關聯。
@ManyToOne
:指明OrderItem和Order之間爲多對一關係。
@ManyToOne
註釋有四個屬性:targetEntity、cascade、fetch 和optional,前三個屬性的具體含義和@OneToMany的同名屬性相同,但@ManyToOne的fetch 屬性默認值是FetchType.EAGER。
optional
屬性是定義該關聯類是否必須存在,值爲false 時,關聯類雙方都必須存在,若是關係被維護端不存在,查詢的結果爲null。值爲true 時, 關係被維護端能夠不存在,查詢的結果仍然會返回關係維護端,在關係維護端中指向關係被維護端的屬性爲null。optional屬性的默認值是true。optional屬性實際上指定關聯類與被關聯類的join 查詢關係,如optional=false時join 查詢關係爲inner join, optional=true 時join 查詢關係爲left join。下面代碼片段解釋以下:
有一點須要強調:當業務方法須要把一個實體
Bean
做爲參數返回給客戶端時,除了實體
Bean
自己須要實現
Serializable
接口以外
,若是關聯類(OrderItem)是延遲加載,還需在返回實體Bean以前經過訪問關聯類的方式加載關聯類(見下例)。不然在客戶端訪問關聯類時將會拋出加載例外。
public
Order getOrderByID(Integer orderid) {
Order order =
em
.find(Order.
class
, orderid);
//!!!!!
由於是延遲加載,經過執行
size()
這種方式獲取訂單下的全部訂單項
order.getOrderItems().size();
return
order;
}
另外無論是否延遲加載,經過join fetch關聯語句均可顯式加載關聯類
,以下例:
public
List getAllOrder() {
Query query =
em
.createQuery(
"select DISTINCT o from Order o inner
join fetch o.orderItems order by o.orderid"
);
List result = query.getResultList();
return
result;
}