Thứ Tư, 28 tháng 10, 2009

11課(01-40)

1.彼は一流の料理人だ。彼が作った料理ならおいしい    
① にわかっている ② にきまった ③ にきまっている ④ に違っている

2.彼は、今住んでいる家    、マンションも持っていて、人に貸している。
① に対し    ② にとって   ③ に際し    ④ に加え

3.テレビ出演    、テレビ局のスタッフと打ち合わせをした。
① に対し    ② にとって   ③ に先に    ④ に先立ち

4.友達は驚いているが、私    、彼と結婚することになろうと思ってもいなかった。
① にしては   ② にして    ③ にしても   ④ にすれば

5.夜も寝ないで勉強したのだから、合格する    
① にきめている ② にきまっている ③ にきまる  ④ にきまった

6.その子は絵の才能    、音楽の才能も豊かである。
① に先立ち   ② に際し    ③ に対し    ④ に加え

7.海外旅行    、旅行先の国のビザを取っておかなければならない。
① に対し    ② にとって   ③ に先に    ④ に先立ち

8.こんな仕事は、私    あまりやりたくはありません。
① にしても   ② に沿っても  ③ に対しては  ④ としても

9.シートベルトをしないで運転したら危ない    
① にきめている ② にきまっていない ③ にきまっている ④ にきまってある

10.国会議員は選挙民の期待    、地元に駅を作ろうがんばった。
① にとって   ② に先立ち   ③ にこたえ   ④ に加えて

11.インタビュー    打ち合わせで、質問する順番を決めておいた。
① に沿う    ② に対し    ③ にして    ④ に先立ち

12.この建物は、百年たっている    、どこも壊れていないし、きれいだ。
① にしろ    ② にしては   ③ にして    ④ にても

13.そんなに塩を入れたら、塩辛い    
① にわかっている ② にきまった ③ にきまっている ④ にきめてある

14.東京都住民の要望      、学校の施設を放課後都民に開放している。
① にとって   ② に先立って  ③ にこたえて  ④ にきわめて

15.公演    、最後のリハーサルが行われた。
① について   ② に先に    ③ に先立ち   ④ に沿い

16.彼は80歳    、元気で若々しい。
① にしても   ② にして    ③ にしては   ④ にすれば

17.猫は人に飼われていても、ひもでつながれていないので、犬    自由である。
① にせよ    ② に比べて   ③ に先立ち   ④ によって

18.子供は親の期待に    として、ストレスがたまっている。
① にあう    ② しよう    ③ こたえよう  ④ 沿う

19.精神的に成長する    、人は美しくなる。
① に先立って  ② に対して   ③ に沿って   ④ にしたがって

20.この料理は一流のコックが作った    、おいしくない。
① にしても   ② にすれば   ③ にしてから  ④ にしては

21.雨の日は、晴れた日    、客の入りが悪い。
① にとって   ② に先立って  ③ に沿って   ④ に比べて

22.ファンのアンコールの声    、歌手は再びステージに登場した。
① にとって   ② にこたえ   ③ に沿い    ④ に加え

23.年月がたつ    、記憶が薄れる。
① に先立って  ② に加えて   ③ にしたがって ④ に沿い

24.ここは都心    珍しく緑が多い。
① にして    ② にしても   ③ にしては   ④ にとっても

25.郊外は都心    、空気もきれいで、住みやすい。
① にして    ② に先立って  ③ に比べて   ④ にとって

26.アパートへの入居    、契約書にサインした。
① に対して   ② に際し    ③ にとり    ④ に加え

27.話が進む    、おもしろくなる。
① に加え    ② に際し    ③ にしたがって ④ に沿って

28.友達がやった    、一緒にいたのだからあなたにも責任がある。
① によっても  ② に比べて   ③ にすれば   ④ にせよ

29.高い山は、平地    夏でも気温が低い。
① にせよ    ② にしても   ③ に比べ    ④ にとって

30.自宅の建て替え工事    、近所に挨拶に行った。
① にときに   ② によって   ③ に対して   ④ に際して

31.上流へさかのぼる    、川幅は狭くなっていった。
① によって   ② に沿って   ③ にせよ    ④ にしたがって

32.卒業式に出席するにしろ    、事前に連絡してください。
① したにしろ  ② しなかったにしろ ③ しないにしろ ④ しないしろ

33.医者になるには、大学の医学部を卒業すること    、医師国家試験にも合格しなければならない。
① によって   ② に比べ    ③ にしたがって ④ に加え

34.入学試験を受ける    、注意すべきことを先輩に助言してもらった。
① に際し    ② にしたがい  ③ に対し    ④ にとり

35.母親    、娘の家では相当のショックだったに違いない。
① に対して   ② にしたら   ③ にして    ④ によって

36.海へ行く    山へ行く    、行くなら、観光客の少ない静かなところがいいね。
① し/し    ② しろ/しろ  ③ にしろ/にしろ ④ と/と

37.彼は車の運転免許    、飛行機の操縦免許も取得した。
① に比べ    ② にしたがい  ③ によりも   ④ に加え

38.車を購入する    、保険に加入しなければならない。
① によっては  ② に際しては  ③ にしたがっては ④ に比べては

39.大学当局    
この学部にこんなに大勢志願者があるとは想像もしなかっただろう
① に比べれば  ② に沿えば   ③ によれば   ④ にすれば

40.部下がしたこと    責任は部長にもある。
① すれば    ② にすれば   ③ にせよ    ④ せよ

Thứ Hai, 26 tháng 10, 2009

10課(01-40)

1.子供__彼は、
大学生と同じくらいの学力を持っていると言われている。
①のに ②ながら ③けど ④しかし

2.新入社員歓迎会__、1年先輩の社員のひとりがスピーチをした。
①によって ②にわたって ③に沿って ④にあたり

3.この仕事は年齢や経験__、誰でもできます。
①にかわり ②にかかって ③にもかかわらず ④にはかかわりなく

4.ハムレットを演じること__、彼の右に出る者はいない。
①にかけては ②にしては ③にとっては ④によっては

5.若いときは、悪いことだとわかってい__暴走行為を繰り返していました。
①ながら ②のに ③ので ④けれど

6.会社をやめる__、やりかけの仕事を田中さんに引きついでもらった。
①にあたって ②にとって ③に沿って ④にかわって

7.事故で片腕を失った__、彼は野球をやめなかった。
①にかかわって ②にかかって ③にもかかわらず ④にはかかわりなく

8.走ること__、校内一だと思っている。
①にかけては ②にとっては ③によっては ④に応じては

9.最近の若者は日本人であり__、間違った日本語を平気で使っている。
①でも ②ながら ③だが ④けど

10.アジア__経済発展は、めざましいものがある。
①にあたって ②にいる ③にある ④における

11.最近は学歴__実力次第で出世できる企業も増えている。
①にはかかわりなく ②に基づいて ③にしたがって ④に伴って

12.骨折した田中選手__佐藤選手が出場し、見事に優勝した。
①において ②にかんして ③にかわり ④に際し

13.母親にしかられて子供はいやいや__塾に出かけた。
①して ②で ③から ④ながら

14.1996年のオリンピックはアトランタ__
おいて行われた。
①で ②に ③を ④へ

15.農業の技術の進歩に伴い、季節__かかわりなくほとんどの野菜が一年中食べられるようになった。
①を ②で ③に ④が

16.父が急用で出席できませんので、父__かわりに私が出席させていただきます。
①は ②の ③を ④に

17.世界の最高峰エベレストに比べたら、富士山__問題にならない。
①より ②ほど ③など ④から

18.江戸時代__、士農工商という身分制度があった。
①については ②にとっては ③においては ④によっては

19.本日は12歳以下に__、入場料は無料になっています。
①しか ②だけ ③のみ ④限り

20.この地方では、米に__野菜を作る農家が増えている。
①わたって ②おいて ③ともに ④かわり

21.都内の一戸建て住宅__、庶民には買えません。
①やら ②ほど ③くせに ④なんて

22.語学学習__留学の利点は大きい。
①における ②に関する ③について ④に応じる

23.この大学は日本人に__、
世界各国からの留学生を受け入れています。
①限り ②限らず ③限って ④限る

24.担当の者が出かけておりますので__私がご説明申しあげます。
①あたって ②かわって ③比べて ④限って

25.テレビ__見ていたら、明日の試験にいい成績は取れませんよ。
①なんか ②ものか ③ことか ④まいか

26.当旅行社は、お客様のご予算__宿泊先をご紹介しております。
①からの ②についた ③に対した ④に応じた

27.私が聞いた__では、彼女はまだ進学するかどうか決めていない。
①限り ②ばかり ③ほど ④こと

28.最近はペットブームで、ペットに__テレビ番組が増えている。
①かける ②関する ③沿った ④つれた

29.大切なのは、心だ。お金__いくらあっても幸せにはなれない。
①かけて ②からといって ③なんて ④といって

30.10代のころは、ロックが好きでしたが、今はうるさいだけです。年齢__、音楽の好みも変わってきました。
①について ②にかわり ③に応じて ④に沿って

31.新装開店のため本日__全品半額です。
①について ②にとって ③に対した ④に限り

32.政府は今後の経済の見通しに__、
学者たちの意見を聞いた。
①おいて ②比べて ③かわって ④関して

33.定年退職する__あたって、あらためて、同僚や家族に感謝の気持ちがわいてきた。
①で ②を ③に ④と

34.話し相手__、目上の人には丁寧な言葉、親しい友達には親しさを表す言葉を使います。
①に応じて ②に応じた ③にかえて ④にかわって

35.技術はまだ未熟ですが、熱心さ__、誰にも負けません。
①にしては ②にとっては ③によっては ④にかけては

36.彼は科学者だが、平和運動__、強い関心を持っている。
①に関しても ②にとっても ③に基づいても ④に応じても

37.新婚旅行で海外に出かける__、パスポートの有効期限を確認した。
①あげくに ②にあたって ③からといって ④において

38.住まいは、その地方の気候__特色があります。
①とともに ②に対する ③にとっての ④に応じた

39.チャーハンを作ること__、彼の右に出る者はいない。
①により ②にとっては ③にかけては ④にしては

40.主人は家では、仕事__関する話は一切しない。
①で ②が ③に ④を



Thứ Tư, 21 tháng 10, 2009

EJB là gì

EJB viết tắt của Enterprise JavaBeans ( tui không dịch )
Nó có đặc điểm cơ bản sau
+ nằm trong lòng các container chính là các application server phía server side ( điển hình là JBOSS và GlassFish )
+ chỉ giao tiếp với các chương trình viết bằng java ( có giao tiếp với webservice viết bằng Java ) miễn là thông qua JNDI các chương trình đó tìm được đúng Bean cần dùng

Về các loại Bean trong EJB
Bean thực ra tương đương với remote component trong .NET nó có 3 loại chính ( có thể chia ra làm 5 loại )

+ Stateless Session Beans : ( loại thứ nhất của Session Bean )nôm na là nó chứa các nghiệp vụ logic mà public ra bên ngoài cho phép các hệ thống khác có thể truy nhập.
+ Stateful Session Beans : ( loại thứ haicủa Session Bean ) giống với loại trên nhưng 2 loại bean này khác nhau đúng 1 điểm : nếu giữa các người dùng sử dụng đến thuộc tính của Session Beans thì với Stateful Session Beans, lần sử dụng sau vẫn lưu giá trị của lần trước đối với người dùng đó còn Stateless Session Bean thì không phân biệt

Nôm na là : nều bạn muốn xài biến Session như viết web asp thì nó chính là Stateful Session Beans, còn nếu bạn muốn biến global thì nó sẽ là Session Beans.

+ Bean Managed Persistent Entity Bean ( BMP )
+ Container Managed Persistent Entity Bean ( CMP )

Hai loại trên dùng để ánh xạ 1 bản ghi trong csdl ở đâu đó mà Application có thể giao tiếp, hoặc đơn giản chỉ là 1 csdl bằng text do bạn tự quy định. CSDL ở đây có thể là tất cả những ghi có thể lưu trữ thông tin
Hai loại này khác nhau đúng chữ "Bean" và "Container". Nó cũng nói lên đặc điểm khác nhau điển hình của chúng. đó là : BMP việc giao tiếp csdl bạn phải tự quan lý ( tự code ), CMP việc giao tiếp csdl là tự động bạn chỉ cần khai báo cấu hình cho bean này ánh xạ đến csdl
Vì vậy CMP giới hạn hơn BMP vì nó chỉ có thể giao tiếp với các hệ quản trị csdl, còn BMP do các bạn viết code nên nó có thể lưu cả trên file txt, xml, excel ... miễn lưu được dữ liệu.
Và SUN cũng khuyên chúng ta cho các client sử dụng BMP và CMP thông qua các loại Session Bean
+ Message driven Bean : loại Bean này Sun đưa vào trong hệ thống EJB theo tôi thì nó là con nuôi của Beans . Vì khi triển khai code Bean thì loại này chẳng giống gì 4 loại Bean trên. Tuy nhiên nó rất quan trọng. Các hệ thống ngân hàng giao tiếp thanh toàn tài khoản với nhau chỉ dùng message cho nên đây là đất võ của Message driven Bean.
Có 2 loại Bean trong Message driven Bean và các loại Bean này năm trong MOM (Message Oriented Middleware)
Hai loại đó là Queue và Topic. Ứng với mỗi loại Bean này MOM có 2 loại hàng đợi phù hợp cho nó.
Quese thì chỉ cho 1 client gửi 1 message tới 1 người ( ví dụ chat yahoo )
Topic thì chỉ cho 1 client gửi 1 message tới nhiều người ( ví dụ chat room trong yahoo )
miễn là người nhận có đăng ký với hàng đợi message.
----------------------------------------------------
cụ thể hoạt động của mỗi loại Bean thì rắc rối nhưng 4 loại trên thì cùng nguyên tắc, JMS có nguyên tắc khác.

Introduction to Struts


Goals After completing this chapter, the student will be able to
  • understand the MVC architecture.
  • set up an application using Struts.
  • use the Struts bean and html tags.
  • process user input from HTML forms through Struts.
Prerequisites The student will need to have an understanding of JSP, JavaBeans, and custom tags.
Objectives This chapter is presented to provide the student with an understanding of the Struts framework.

The Model-View-Controller Architecture

"Model-View-Controller" is a way to build applications that promotes complete separation between business logic and presentation. It is not specific to web applications, or Java, or J2EE (it predates all of these by many years), but it can be applied to building J2EE web applications.

The "view" is the user interface, the screens that the end user of the application actually sees and interacts with. In a J2EE web application, views are JSP files. For collecting user input, you will have a JSP that generates an HTML page that contains one or more HTML forms. For displaying output (like a report), you will have a JSP generates an HTML page that probably contains one or more HTML tables. Each of these is a view: a way for the end user to interact with the system, putting data in, and getting data out.

When the user clicks 'Submit' in an HTML form, the request (complete with all the form information) is sent to a "controller". In a J2EE web application, controllers are JavaBeans. The controller's job is to take the data entered by the user (in the HTML form that the JSP generated) and pass it to the "model", which is a separate Java class that contains actual business logic. The model does whatever it does (for instance, store the user's data in a database), then returns some result back to the controller (perhaps a new ID value from the database, or perhaps just a result code saying "OK, I'm done"). The controller takes this value and figures out what the user needs to see next, and presents the user with a new view (for instance, a new JSP file that displays a confirmation that the data they entered was successfully saved).

This all sounds like a lot of work, and it is. But there is a point to architecting applications this way: flexibility. The beauty of model-view-controller separation is that new views and controllers can be created independently of the model. The model -- again, this is pure business logic -- knows nothing of HTML forms or JSP pages. The model defines a set of business functions that only ever get called by controllers, and the controllers act as proxies between the end user (interacting with the view) and the business logic (encapsulated in the model). This means that you can add a new view and its associated controller, and your model doesn't know or care that there are now two different ways for human beings to interact with the application.

For instance, in an application with complicated data entry screens, you could add a JSP that generated a quick-edit form with default values instead of a longer, standard form. Both JSPs (the short form and the long form) could use the same controller; default values could simply be stored in the HTML

as hidden input values, and the controller would never know the difference. Or you could create a completely new interface -- a desktop application in addition to a web application. The desktop application would have views implemented in some interface-building tool, and have associated controllers for each screen. But these controllers would call the business functions in the model, just like the controllers in the web application. This is called "code reuse", specifically "business logic reuse", and it's not just a myth: it really can happen, and the Model-View-Controller architecture is one way to make it happen.


What is Struts?

Struts is a framework that promotes the use of the Model-View-Controller architecture for designing large scale applications. The framework includes a set of custom tag libaries and their associated Java classes, along with various utility classes. The most powerful aspect of the Struts framework is its support for creating and processing web-based forms. We will see how this works later in this chapter.


Struts Tags

Common Attributes

Almost all tags provided by the Struts framework use the following attributes:

Attribute Used for
id the name of a bean for temporary use by the tag
name the name of a pre-existing bean for use with the tag
property the property of the bean named in the name attribute for use with the tag
scope the scope to search for the bean named in the name attribute

Referencing Properties

Bean properties can be referenced in three different ways: simple, nested, or indexed. Shown here are examples for referencing the properties each way:

Reference Method Example
simple
nested
indexed

flavorful mix of methods

Creating Beans

Beans are created by Java code or tags.

Here is an example of bean creation with Java code:

// Creating a Plumber bean in the request scope
Plumber aPlumber = new Plumber();
request.setAttribute("plumber", aPlumber);

Beans can be created with the tag:




creating/using a bean in session scope of type java.lang.String

Most useful is the creation of beans with Struts tags:






Other Bean Tags

The Struts framework provides other tags for dealing with issues concerning copying cookies, request headers, JSP implicity defined objects, request parameters, web application resources, Struts configuration objects, and including the dynamic response data from an action. These tags are not discussed here, but it is important to be aware of their existence.










Bean Output

The and tags from the Struts framework will write bean and aplication resources properties into the current HttpResponse object.


This tag allows locale specific messages to be displayed by looking up the message in the application resources .properties file.








This tag writes the string equivalent of the specified bean or bean property to the current HttpResponse object.




Creating HTML Forms

Quite often information needs to be collected from a user and processed. Without the ability to collect user input, a web application would be useless. In order to get the users information, an html form is used. User input can come from several widgets, such as text fields, text boxes, check boxes, pop-up menus, and radio buttons. The data corresponding to the user input is stored in an ActionForm class. A configuration file called struts-config.xml is used to define exactly how the user input are processed.

The following diagram roughly depicts the use of Struts for using forms.


The Struts html tags are used to generate the widgets in the html that will be used in gathering the users data. There are also tags to create a form element, html body elements, links, images, and other common html elements as well as displaying errors. Below are the tags provided by html section of the Struts framework and a short description of each.

Note: Most of the tags for use with forms are able to take the name and property attributes representing the initial state of the widgets and for capturing the state that the widgets were in when a form submission occurred.


Generates an tag. This tag should be used inside a element.
Generates an tag and causes the Action servlet not to invoke its validate() method. This tag should be used inside a element.

Generates an .

Generates an . "Checkedness" depends upon whether the property array specified contains a corresponding value as the one specified for the multibox.


Generates a tag. This tag should be used inside of a tag.



Wheat Wood Clay
Stone Sheep
Generates html to display any errors that may have occurred during invocation of the validate() method.

Generates
.
There is a hidden element here which is invisible. :-)
Generates . Generates .

A link to an external site
Generates an html link.
Generates for use in collecting information that should not be shown on-screen.
Credit Debit

Generates a radio button ().

Generates .





Generates


Generates to submit form data entered by the user.

Name
Email Address
Generates .

Generates

Thứ Ba, 20 tháng 10, 2009

Tìm hiểu Hibernate

Chương 1.
1.1. Khái niệm Hibernate


1.1.1. ORM Framework

• Framework là một khái niệm trong phát triển phần mềm dùng để chỉ những “cấu trúc hỗ trợ được định nghĩa” mà trong đó những dự án phần mềm khác có thể được sắp xếp vào đó và phát triển.

• ORM (Object Relational Mapping) framework là một cơ chế cho phép người lập trình thao tác với database một cách hoàn toàn tự nhiên thông qua các đối tượng. Lập trình viên hoàn toàn không quan tâm đến loại database sử dụng, SQL, …
1.1.2. Persistence Layer

• “Tier” và “Layer”: tier thường được gắn với phần cứng về mặt vật lý (physical) còn layer thì dính đến vấn đề cách thức tổ chức bên trong của ứng dụng. Việc phân chia tier là “trong suốt” (transparent) đối với ứng dụng về mặt luận lý (logical). Điều này có nghĩa là khi ta phát triển một ứng dụng, chúng ta không bận tâm đến các thành phần (component) sẽ triển khai (deploy) ra sao mà chỉ chú ý là chúng ta sẽ tổ chức ứng dụng thành những layer như thế nào.

• Peristence layer: một ứng dụng có thể được chia làm 3 phần như sau: giao diện người dùng (presentation layer), phần xử lý nghiệp vụ (business layer) và phần chứa dữ liệu (data layer). Cụ thể ra, business layer có thể được chia nhỏ thành 2 layer con là business logic layer (các tính toán nhằm thỏa mãn yêu cầu người dùng) và persistence layer. Persistence layer chịu trách nhiệm giao tiếp với data layer (thường là một hệ quản trị cơ sở dữ liệu quan hệ - Relational DBMS). Persistence sẽ đảm nhiệm các nhiệm vụ mở kết nối, truy xuất và lưu trữ dữ liệu vào các Relational DBMS.
1.1.3. Hibernate Framework

• Hibernate là một trong những ORM Framework

• Hibernate framework là một framework cho persistence layer. Như vậy, nhờ có Hibernate framework mà giờ đây khi bạn phát triển ứng dụng bạn chỉ còn chú tâm vào những layer khác mà không phải bận tâm nhiều về persistence layer nữa.

• Hibernate: là một dịch vụ lưu trữ và truy vấn dữ liệu quan hệ mạnh mẽ và nhanh.

 Hibernate giúp bạn phát triển các class dùng để lưu trữ dữ liệu theo cách thức hướng đối tượng: association, inheritance, polymorphism, composition và collections
 Hibernate cho phép bạn thực hiện các câu truy vấn dữ liệu bằng cách sử dụng ngôn ngữ SQL mở rộng của Hibernate (HQL) hoặc là ngôn ngữ SQL nguyên thủy cũng như là sử dụng các API.
 Hibernate được license theo LGPL (Lesser GNU Public License). Theo đó, bạn có thể thoải mái sử dụng Hibernate trong các dự án open source hoặc các dự án thương mại (commercial).
1.2. Cài đặt và sử dụng

1.2.1. Cài đặt

• Việc cài đặt Hibernate rất đơn giản. Hibernate được build thành 1 tập tin JAR. Bạn chỉ cần download tập tin này và lưu nó vào thư mục LIB của project mà bạn đang phát triển.

• Download JDBC Driver cho database (cũng được build thành 1 tập tin JAR).

• Thêm các thành phần liên quan của Hibernate vào classpath.

1.2.2. Sử dụng

• Việc sử dụng Hibernate cũng rất đơn giản. Bạn cần gì ở một persistence layer? Đó là chúng sẽ truy xuất cũng như lưu trữ dữ liệu của bạn xuống database. Về mặt vật lý, theo mô hình dữ liệu quan hệ, dữ liệu của bạn sẽ bao gồm các thực thể (entity) có quan hệ với nhau. Và khi hiện thực cụ thể hơn mức database, chúng sẽ được đại diện bởi các table, bởi các ràng buộc khóa ngoại, khóa chính, … Hibernate cũng như vậy.

• Mỗi table trong database là một object trong Hibernate. Do đó, bạn cần có một java bean cho mỗi table trong database. Các java bean này sẽ có các getters / setters và một số ngoại lệ theo quy ước của Hibernate.

• Tiếp theo để Hibernate biết một object được “ánh xạ” (mapping) như thế nào với table trong database, Hibernate yêu cầu bạn cung cấp tập tin đặc tả gọi là mapping file. Theo quy ước của Hibernate, các mapping file này có đuôi là .hbm.xml và phải hợp lệ với DTD (Document Type Definition) mà Hibernate đã đưa ra. Trong các mapping file này, bạn sẽ đặc tả các mối quan hệ giữa property của object với field của table. Tức là bạn giúp cho Hibernate hiểu “mối quan hệ giữa các object” tương ứng như thế nào với “mối quan hệ giữa các field”.

• Tiếp theo nữa, bạn cần có 1 tập tin để Hibernate bắt đầu: hibernate.cfg.xml. Có thể nói tập tin này được load lên đầu tiên khi bạn “khởi động” Hibernate. Trong tập tin này, bạn đặc tả các thông tin sau:

 SQL Dialects.
 JDBC connection property: connection (url, driver class name, user name, password, pool size).
 Hoặc là datasource property: datasource JNDI name, user name, password.
 Hibernate configuration: show sql, …
 Hibernate cache configuration.
 Hibernate transaction configuration.
 Miscellaneous configuration.
1.3. Các tập tin config

1.3.1. hibernate.cfg.xml

• Tập tin này bắt đầu bằng thẻ và kết thúc với thẻ .

• Thẻ là thẻ con của thẻ . Những thể con của thẻ được sử dụng để định nghĩa properties và resources của session-factory.

• Để định nghĩa các properties của session-factory, ta sử dụng thẻ class.

 name của thẻ property là property của session-factory. Những properties của session-factory có thể là:
o hibernate.connection.driver_class
o hibernate.connection.url
o hibernate.connection.username
o hibernate.connection.password
o hibernate.connection.pool_size
o show_sql
o dialect
o hibernate.hbm2ddl.auto
o …

 class là các giá trị của các properties của session-factory.

 Ví dụ:

com.mysql.jdbc.Driver


• Để định nghĩa resouces của session-factory, ta sử dụng

 resource là đường dẫn url của hbm.xml file.

1.3.2. hibernate.properties

Khai báo các properties trong 1 file tên là: hibernate.properties, chỉ cần đặt file này trong classpath của ứng dụng. Nó sẽ tự kiểm tra và đọc khi Hibernate khởi chạy lần đầu tiên, là khi tao 1 Configuaration object. Tương tự như hibernate.cfg.xml, hibernate.properties cũng để khai báo các thông số, nhưng hibernate.properties thường được kết hợp với spring config.
1.4. Tập tin hbm.xml – tập tin ánh xạ:


1.4.1. Cấu trúc cơ bản
• Bắt đầu bằng và kết thúc với .

• Từng bảng trong CSDL được đinh nghĩa bằng thẻ và chứa những thuộc tính (attributes):

 name: là tên của lớp đối tượng dữ liệu (data object class) (của bảng tương ứng trong CSDL).
 table: là tên của bảng trong CSDL.

• Thẻ có các thẻ con sau:

 Thẻ : để định nghĩa id của bảng. Nó có những thuộc tính sau:
o name: là tên property của đối tượng dữ liệu (data object).
o column: là tên của cột trong CSDL.
o type: là kiểu dữ liệu của cột. Chú ý: đây là một kiểu của Hibernate chứ không phải của kiểu dữ liệu của Java hay của CSDL.

 Thẻ cũng có thẻ con sau:
o Thẻ để cho biết loại id trong table của CSDL (được gàn là: no-generate, increment: được tạo ra bởi hibernate (không nên sử dụng), identity: tự động tạo ra bởi CSDL, native: chọn các kiểu tạo khác như sequence của Oracle.

 Thẻ để chỉ ra một cột bình thường, có cùng thuộc tính như thẻ ngoại trừ việc thẻ này không có thẻ con .

1.4.2. Mapping types

Mapping types là những kiểu dữ liệu mà khi khai báo ở tập tin hbm.xml sẽ dược ánh xạ tương ứng. Hibernate có một số kiểu dữ liệu sẵn có mà Hibernate đã định nghĩa, goi là Built-in mapping types. Ngoài ra, bạn cụng có thể tự định nghĩa một kiểu riêng của bạn.
1.5. org.hibernate.cfg.Configuration

1.5.1. Configure()

Sử dụng các phép ánh xạ (mappings) và các đặc tính được xác định (properties specified) trong một tài nguyên ứng dụng (application resource) được đặt tên là hibernate.cfg.xml. Nhiều người thích tập trung cấu hình Hibernate bằng cách này thay vì thêm tham số vào Configuration trong code của ứng dụng.

1.5.2. addResource(String path)

Đọc các mappings trong một application resource (sử dụng cái này khi không muốn sử dụng file .cfg.xml để config).

1.5.3. addClass(java.lang.Class class)

Đọc mapping files của class đầu vào (ví dụ, có lớp User and và có User.hbm.xml, khi sử dụng addClass(User.class) nghĩa là thêm User.hbm.xml resource file vào Configuration).

1.5.4. setProperties(java.util.Properties)

Ta có thể class, driver, user, password (,…) để truy cập vào database bằng cách sử dụng .cfg.xml file hoặc .properties file. Khi sử dụng .properties file, phải sử dụng phương thức này để config.
1.6. org.hibernate.Session

1.6.1. Cách sử dụng

//open a session
Session session = sessionFactory.openSession();
//begin a transaction
Transaction tx = session.beginTransaction();

//
//do sth with session here
//

//commit
tx.commit();
//close session
session.close();



1.6.2. Rút trích một persistence object bằng id

Ví dụ lấy ra một user bằng id:

User user = session.get(User.class, new Long(100));



Nếu chúng ta sử dung phương thức này để lấy User với cùng id trong cùng session, phương thức này sẽ trả về một instance của User (không phải 2 instance).

Ví dụ:

User user1 = session.get(User.class, new Long(100));
User user2 = sessoon.get(User.class, new Long(100));



=> user1= user2

Ta có thể rút trích bằng phương thức load(). Sự khác biệt giữa phương thức load() và get() là ta có thể không rút trinh một đối tượng được trả về bởi phương thức load() khi session đã bị đóng (close).

1.6.3. lock()

Sau khi lấy một đối tượng từ CSDL, ta đóng session lại. Cái việc này sẽ làm cho đối tượng trở thành intacnce bị tách biệt (detached instance). Nó có thể được kết hợp lại (reassociated) với Session mới bằng cách gọi lock(). Phương thhức này sẽ ném ra một ngoại lệ là HibernateException khi nó không thể tìm thấy id trong CSDL bằng với id của đối tượng. HibernateException cũng sẽ bị ném khi bạn thay đổi id của đối tượng sau khi kết hợp lại.

Ví dụ:

Session session = sessionFactory.openSession();
User user = (User) session.get(User.class, new Long(100));
Session.close(); //user becomes detached

Session session2 = sessionFactory.openSession(); //another session
session2.lock(user, LockMode.NONE); //reassociated



1.6.4. Updating persistence objects

Các đối tượng được rút trích bởi phương thức session.load() hay session.get() đã được kết hợp với CSDL. Chúng ta chỉ cần set những giá trị mới và commit cái transaction để update. Objects that are reassociated are also the same.

Ví dụ:

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User user = (User) session.get(User.class, new Long(100));
user.setName(“ABC”);
tx.commit();
session.close();



Detached objects có thể thường được cập nhật bởi phương thức update(). Các đối tượng được cập nhật cũng được kết hợp lại với session mới.

Ví dụ:

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User user = (User) session.get(User.class, new Long(100));
user.setName(“ABC”);
tx.commit();
session.close();

// pretend that user has 2 properties, first is
// name, second is password; and the values by
// roster are “AAA” and “BBB”.
user.setName(“ABC”);//new name value
Session session2 = sessionFactory.openSession();
tx = session2.beginTransaction();
session2.update(user); //update and reassociated
user.setPassword(“EFG”);
tx.commit();
session2.close();

//the new values of user in turn of name and password are “ABC” and “EFG”



Một StaleStateException sẽ được ném khi ta cập nhật một đối tượng không tồn tại.

1.6.5. Insert

Để insert một đối tượng vào CSDL, ta sử dụng phương thức save(). Sau khi gọi phương thức này, đối tượng sẽ được kết hợp lại với session.

Ví dụ:

User user = new User();
user.setId(120);
user.setName(“Name”);
user.setPassword(“Password”);
Session session = sessionFactory.openSession();
Transaction tx = Session.beginTransaction();
session.save(user);
user.setName(“NewName”);
tx.commit();
session.close();
/* after executing the code above, in database, there is a row containing values as follow: id = 120, name = “NewName”, password = “Password” */



1.6.6. Delete

Để delete một dòng trong CSDL, ta phải đưa ra một đối tượng tương ứng với bảng trong CSDL. Nhưng ta không cần phải đưa hết giá trị vào các thuộc tính của đối tượng, ta chỉ cần set cái id của đối tượng. Phương thức này sẽ ném ra một ngoại lệ (StaleStateException) khi ta muốn xóa một đối tượng có id mà id này ko tồn tại trong CSDL.

Ví dụ:

User user = new User();
User.setId(100);
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.delete(user);
tx.commit();
session.close();
1.6.7. Ngoại lệ ConstraintViolationException
Khi bạn có gắng để save, update, delete những đối tượng mà sẽ xâm phạm các ràng buộc CSDL (như duplicate identifier, not-null constraint, unique constraint), ngoại lệ ConstraintViolationException sẽ được ném ra.

1.7. org.hibernate.Transaction

1.7.1. Understanding database transactions

• Một database transaction nhóm các thao tác truy cập dữ liệu. Một transaction sẽ kết thúc bằng một trong 2 cách sau đây: committed hoặc rolled back.

• Nếu có nhiều thao tác dữ liệu được thực thi trong một transaction, bạn phải đánh dấu chắc chắn cho từng công việc. Bạn phải start transaction, và ở 1 vài thời điểm, phải commit những thay đổi. Nếu có lỗi xảy ra (trong quá trình thực thi các thao tác hay trong lúc đang commit những thay đổi), bạn phải roll back transaction để đưa dữ liệu trở về tình trạng thích hợp. Việc này còn được gọi là transaction demarcation.

• Minh họa: tình trạng trong quá trình của một transaction

1.7.2. JDBC và JTA transactions

• Trong môi trường non-managed, JDBC API thường đánh dấu các giao tác. Bạn bắt đầu một transaction bằng cách gọi setAutoCommit(false) trong JDBC connection và kết thúc nó bằng cách gọi commit(). Đôi khi, bạn muốn ép nó rollback ngay lập tức thì có thể làm bằng cách gọi rollback().

• Trong hệ thống lưu trữ dữ liệu trên nhiều cơ sở dữ liệu, một công việc có thể truy cập đến nhiều hơn 1 kho dữ liệu. Trong trường hợp này, bạn không thể chỉ sử dụng JDBC một mình. Bạn cần phải có một transaction manager mà hỗ trợ transaction phân bố. Bạn có thể liên lạc với transaction manager bằng cách sử dụng JTA.

• Trong môi trường managed, JTA không chỉ sử dụng cho transaction phân bố mà còn sử dụng cho container managed transactions (CMT). CMT cho phép bạn ngăn ngừa được những transaction gọi trong source code của ứng dụng.

• Hibernate tác động tới database thông qua JDBC Connection. Vì thế nó hỗ trợ cả APIs. Trong một ứng dụng đơn lẻ, chỉ cần JDBC transaction là đủ, còn trong một ứng dụng server thì Hibernate có thể sử dụng JTA transaction. Như vậy, code Hibernate giổng cả 2 môi trường managed và non-managed. Hibernate cung cấn nhựng lớp trừu tượng bên của nó, được dấu bên dưới transaction API. Hibernate cho phép người sử dụng mở rộng bằng cách đưa thêm vào CORBA transaction service.

1.7.3. Hibernate Transaction API

• Transaction interface cung cấp những phương thức cho một database transaction. Xem ví dụ cơ bản dưới đây:

Session session = session.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();

concludeAuction();

tx.commit();
} catch (Exception e) {
if (tx != null) {
try {
tx.rollback();
} catch (HibernateException he) {
// log he and rethrow e
}
}
throw e;
} finally {
try {
session.close();
} catch (HibernateException he) {
throw he;
}
}



• Việc gọi session.beginTransaction() là đánh dấu điểm bắt đầu của một một database transaction. Trong trường hợp là môi trường non-managed thì JDBC transaction sẽ bắt đầu trên JDBC connection. Còn trong môi trường managed, nó sẽ bắt đầu một JTA transaction mới nếu chưa có tồn tại JTA transaction, hoặc là kết hợp với JTA transaction đã tồn tại. Tất cả việc này đều được quản lý bởi Hibernate, nên bạn không cần phải quan tâm đến vấn đền này.

• Việc gọi tx.commit() đồng thời thay đổi tình trạng Session đối với cơ sở dữ liệu. Hibernate sẽ commit transaction bên dưới khi và chỉ khi beginTransaction() bắt đầu một transaction mới. Nếu beginTransaction() không bắt đầu một transaction bên dưới mới, commit() chỉ thay đởi tình trạng Session đối với cơ sở dữ liệu.

• Nếu concludeAuction() ném ra một ngoại lệ, chúng ta phải ép buộc transaction rollback bằng cách gọi tx.rollback().
1.8. Mối kết hợp (Association)

Có 2 mối kết hợp thường được sử dụng. Đó là many-to-one và one-to-many. (còn lại rất hiếm được sử dụng, đó là one-to-one và many-to-many).

1.8.1.

Có những thuộc tính và thẻ con sau:

• Child “column”: chứa tên thuộc tính để chỉ ra cái trường trong CSDL mà chứa khóa ngoại.
• Attribute “name”: tên của bảng trong CSDL mà được tham chiếu đến.
• Attribute “class”: đối tượng tương ứng của bảng trong CSDL mà được tham chiếu đến.
• Attribute “lazy”: nếu được set là true, nạp những đối tượng có liên quan từ CSDL mỗi lần nạp đối tượng này.

1.8.2.

Để chỉ ra quan hệ one-to-many, ta không chỉ đưa ra thẻ one-to-many. Mà còn có những thức khác để làm:

• Đầu tiên, ta phải sử dụng thẻ . Lớp tương ứng trong Java là Set. Ta sử dụng đối tượng này để giữ những giá trị của bảng tham chiểu đến bảng này.
• Trong thẻ này, ta phải chỉ ra các thuộc tính và các thẻ con sau:

 Attribute “name”: tên của bảng tham chiếu đến bảng này.
 Attribute “lazy”: nếu được set là true, nạp đối tượng liên quan từ CSDL mỗi lần nạp đối tượng này.
 Child “key”: có thẻ con là column mà thuộc tính name của nó chứa cái tên của trường chứa khóa ngoại của bảng mà giữ cái id của bảng này.
 Child “one-to-many”: chứa thuộc tính class để chỉ ra lớp tương ứng của bảng ngoại.
1.9. Simple Queries

1.9.1. HQL (Hibernate Query Language)

1.9.1.1. Tạo thể hiện

Để tạo một thể hiện của HQL, sử dụng session.createQuery(String)

1.9.1.2. Simple query

Ví dụ 1:

//get all records in table User.
Query query = session.createQuery("from User")



Ví dụ 2:

Query query = session.createQuery("from User u where u.name = :name");
query.setString("name", "THUAN");



Chú ý rằng User không phải là tên của bảng trong cơ sở dữ liệu. “User” là tên của đối tượng tương ứng với bảng đó. Và tên của những đối tượng này có phân biệt chữ hoa và chữ thường.

1.9.1.3. Kết bảng trong HQL

Một User chứa 1 tập hợp billings (có thuộc tính billings với accessor của nó). Trong mỗi billing, ta có 1 amount (số lượng). Bây giờ, ta muốn lấy tất cả User mà có billing chứa amount lớn hơn 100. Ta sử dũng HQL sau đây:

Query query = session.createQuery("from User user left join fetch user.billings billing where billing.amount > 100");



Chú ý rằng “billings” là tên của một thuộc tính trong cách thuộc tính của “User”. Và nó cũng có một getter và một setter cho billings.

1.9.1.4. Sub-query trong HQL

Ta muốn liệt ke toàn bộ user mà có billing (một vài user có thể không có billings). Ta sử dụng HQL sau đây:

Query query = session.createQuery("from User user where user in (select b.user from Billing B)");



Hoặc:

Query query = session.createQuery("from User user where exists (select 1 from user.billings)");



Chú ý rằng, sub-query trả về nhiều dòng. HQL cũng định nghĩa một số từ khóa để thu hẹp kết quả như: “in”, “all”, “any”, “some”.

1.9.1.5. Gom nhóm

Ví dụ:

Query query = session.createQuery("select count(*) from User");
Query query = session.createQuery("select b.user, sum(b.amount) from Billing b group by b.user");

1.9.2. Điều kiện (Criteria)

1.9.2.1. Tạo thể hiện

Để tạo một thể hiện của Criteria, sử dụng: session.createCriteria(User.class)

1.9.2.2. Add(Criterion)

Tìm trong trong các điều kiện, sử dụng phương thức: add(Criterion)

Ví dụ 1:

Criteria crit = session.createCriteria(User.class);
crit.add(Restrictions.eq("name", "Thuan"); //tìm user có name = 'Thuan'



Những phương thức dưới đây dùng để giới hạn tìm kiếm:

eq(String colName, String value): equal
gt(String colName, String value): greater than
ge(String colName, String value): greater than or equal



và …

Ví dụ: 2: lấy tất cả billing mà có amount nhỏ hơn 100 hoặc lớn hơn 1000

Criteria crit = session.createCriteria(Billing.class);
Crit.add(Restrictions.or(
Restrictions.lt("amount", 100),
Restrictions.gt("amount", 1000));



Sử dụng điều kiện “and” bằng cách tương tự như trên.

1.9.2.3. Kết

Ví dụ dưới đây sẽ lấy tất cả Users (và Billings của họ) mà có amount (của billing) lớn hơn 100.

Criteria crit = session.createCriteria(User.class);
crit.createCriteria("billings", "bill");
crit.add(Restrictions.gt("bill.amount", new Integer(100));



1.9.3. SQL

1.9.3.1. Tạo thể hiện

Đề tạo một thể hiện của SQL Query, sử dụng:
session.createSQLQuery(String).addEntity(String)

Ví dụ:

Query query = session.createSQLQuery("select * from User").addEntity(User.class);



1.9.3.2. SQLGrammaException

Nếu ta chỉ chọn từ User nhưng ta addEntity khác (ví dụ như Billing), Ngoại lệ SQLGrammaException sẽ được ném ra.

Ví dụ:

//SQLGrammaExeption will be thrown in the following code
Query query = session.createSQLQuery("select * from User").addEntity(User.class).addEntity(Billing.class);



1.9.3.3. Chọn nhiều bảng, chỉ addEntity một bảng

Nếu ta chọn từ nhiều bảng nhưng ta chỉ addEntity một bảng. Kiểu dữ liệu trả về chỉ là Entity đó.

Ví dụ:

Query query = session.createSQLQuery("select * from Billing b left join User u on u.ID = b.userID").addEntity(User.class);
//this query will return a List of User class.



1.9.3.4. Chọn nhiều bản, addEntity nhiều hơn 1 bảng

Nếu ta chọn từ nhiều bảng và ta addEntity nhiều hơn 1 bảng. Kiểu dữ liệu trả về là một mảng đối tượng chứa class theo thứ tự được add.

Ví dụ:

Query query = session.createSQLQuery("select * from Billing b left join User u on u.ID = b.userID")
.addEntity(User.class)
.addEntity(Billing.class);
Iterator iterator = query.list().iterator();
Object[] array;
User user;
Billing billing;
While (iterator.hasNext()) {
array = (Object[]) iterator.next();
User user = (User) array[0];
Billing billing = (Billing) array[1];
System.out.println("UserID = " + user.getId() + "; BillingID = " + billing.getId());
}



1.9.3.5. Gom nhóm

Ví dụ:

Query query = session.createSQLQuery("select count(1) userCount from User")
.addScalar("userCount", Hibernate.Integer);

Query query = session.createSQLQuery("select u.*, sum(b.amount) sumAmount from Billing b left join User u on u.ID = b.userID group by u.id")
.addEntity(User.class)
.addScalar("sumAmount", Hibernate.Integer);



Kiểu dữ liệu trả về là danh sách Object[2]. Object[0] là giá trị của phương thức addScalar method, kế tiếp là giá trị của phương thức addEntity.

1.9.4. Giới hạn kết quả trả về

Để giới hạn kết quả trả về, ta sử dụng 2 phương thức: setMaxResults(int) và setFirstResult(int).
2 phương thức này đều được thi hành bởi Criteria và Query
2.1. Khái niệm bean trong Spring

2.1.1. Cách khai báo 1 bean

• Bắt đầu trong spring là bằng thẻ và kết thúc bằng . Để định nghĩa 1 bean, ta dùng tag sau:





Singleton cho biết bean này chỉ được khởi tạo lên 1 lần. Mặc định singleton="true" (vì phần lớn controller chỉ cần khởi tạo 1 lần).

2.1.2.

• Ta có thể dùng tag property để set giá trị cho attribute của lớp và dùng tag contructor-arg để chỉ định contructor mà mình muốn dùng.

• Ví dụ, ta có class MyBean như sau:

package mypring;
public class MyBean {
private int myInt;
private List myList;
public MyBean(int myInt) {
this.myInt = myInt;
}
public void setMyInt(int myInt) {
this.myInt = myInt;
}
public int getMyInt() {
return this.myInt;
}
public void setMyList(List myList) {
this.myList = myList;
}
public List getMyList() {
return this.myList;
}
}



• Ta sẽ khai báo bean như sau:



1


2



red
blue






2.1.3.

• Một bean cũng có thể chứa bean khác bằng cách dùng tag ref:




Thứ Hai, 19 tháng 10, 2009

Tổng quan Hibernate framework

IT - Bài viết
Có lẽ bạn đã nghe nói nhiều về Hibernate framework? Thế Hibernate framework là gì? Hy vọng mình và bạn sẽ có trả lời câu hỏi đó khi đọc xong những dòng bên dưới.

Trước khi tìm hiểu Hibernate là gì, chúng ta cần chuẩn bị một số kiến thức để làm nền tảng. Đầu tiên, chúng ta cần tìm hiểu "framework" là gì? Framework ngày nay được "lạm dụng" rất nhiều. Nhiều người hay gán một vài thứ là "framework" nhưng gán gọi như vậy có đúng không lại là một chuyện khác. Theo cộng đồng wikipedia, từ framework dùng trong phát triển phần mềm là một khái niệm dùng để chỉ những "cấu trúc hỗ trợ được định nghĩa" mà trong đó những dự án phần mềm khác có thể được sắp xếp vào đó và phát triển. Thông thường, một framework bao gồm những program hỗ trợ, code libs và một ngôn ngữ scripting nằm giữa các chương trình phần mềm khác để giúp phát triển và gắn những thành phần khác nhau trong dự án phần mềm lại với nhau.
Tiếp theo, chúng ta cần tìm hiểu về "persistence layer". Từ này tạm thời mình chưa thể dịch sang tiếng Việt được mà chỉ giải thích để bạn hiểu nó là cái gì thôi. Như bạn đã biết, kiến trúc ứng dụng dụng phần mềm có nhiều loại. Có loại chỉ chạy trên một máy là đủ. Có chương trình muốn chạy được phải kết nối sang một máy khác (client-server). Một máy đóng vai trò như là người yêu cầu (client) và máy khác đóng vai trò kẻ phục vụ (server). Người ta sử dụng thuật ngữ "tier" để chỉ mỗi loại máy có vai trò khác nhau đó. Tier client để chỉ các máy đóng vai trò client và tier server để chỉ các máy đóng vai trò server. Và loại ứng dụng client-server là ứng dụng 2-tier (vì chỉ có 2 tier thôi). Tương tự như vậy theo sự phát triển như vũ bão của công nghệ phần cứng và phần mềm cộng với nhu cầu của các người dùng, doanh nghiệp và xã hội ngày càng lớn, chúng ta thấy có các ứng dụng 3-tier và n-tier để khắc phục nhược điểm của ứng dụng 2-tier và nhằm tăng sức mạnh xử lý cho ứng dụng. "Layer" là một khái niệm khác với "tier". Và chúng ta đừng lầm lẫn giữa "tier" và "layer". Tier thường gắn với phần cứng máy tính (về mặt physically) còn "layer" thì dính với vấn đề cách thức tổ chức bên trong của ứng dụng. Việc phân chia tier là "trong suốt" (transparent) đối với ứng dụng xét về mặt luận lý (logically). Điều này có nghĩa là khi chúng ta phát triển một ứng dụng, chúng ta không bận tâm đến các thành phần (component) sẽ triển khai (deploy) ra sao mà chỉ chú ý là chúng ta sẽ tổ chức ứng dụng thành những layer như thế nào. Ví dụ, một ứng dụng có thể chia làm 3 phần như sau: phần giao diện người dùng (UI layer), phần xử lý nghiệp vụ (business layer) và phần chứa dữ liệu (data layer). Cụ thể ra, business layer sẽ có thể chia nhỏ thành 2 layer con là business logic layer (chỉ quan tâm đến ý nghĩa của các nghiệp vụ, các tính toán mang nhằm thoả mãn yêu cầu của người dùng) và persitence layer. Persistence layer chịu trách nhiệm giao tiếp với data layer (thường là một hệ quản trị cơ sở dữ liệu quan hệ - Relational DBMS). Persistence layer sẽ đảm nhiệm các nhiệm vụ mở kết nối, truy xuất và lưu trữ dữ liệu vào các Relational DBMS.

Việc phân chia như vậy có lợi ích là công việc sẽ được tách bạch ra. Người nào lo thiết kế và xử lý UI thì chỉ việc chú tâm vào công việc đó. Người lo business layer thì chỉ cần tập trung vào thiết kế và phát triển làm sao thoả mãn các requirement của khách hàng mà không phải chú tâm đến các khía cạnh hiện thực bên dưới thông thường liên quan đến technical issues. Còn người lo persistence layer thì chỉ việc chú trọng đến các khía cạnh hiện thực và giải quyết các technical issues mà thôi. Cũng như sẽ có những DBA (DB Administrators) lo việc cài đặt và tạo các objects trong các relational database.

Như vậy, bạn đã hiểu ứng dụng được chia một cách logically thành các "layer" và bạn cũng hiểu được là persistence layer là một layer có nhiệm vụ kết nối Relational DBMSs và truy xuất, thao tác trên dữ liệu đã được lưu trữ cũng như lưu trữ dữ liệu mới vào chúng. Hibernate framework là một framework cho persistence layer. Và bạn có thể thấy rằng nhờ có Hibernate framework mà giờ đây khi bạn phát triển một ứng dụng bạn chỉ còn chú tâm vào những layer khác mà không phải bận tâm nhiều về persistence layer nữa. Tương tự như vậy nếu bạn có một UI framework, bạn sẽ không phải bận tâm nhiều về UI layer nữa. Và xét đến cùng, việc bạn quan tâm duy nhất là business logic layer của bạn có đáp ứng yêu cầu của khách hàng không hay thôi.

Và đây là thông tin về Hibernate framework từ website chính thức của Hibernate: Hibernate là một dịch vụ lưu trữ và truy vấn dữ liệu quan hệ mạnh mẽ và nhanh. Hibernate giúp bạn phát triển các class dùng để lưu trữ dữ liệu theo cách thức rất là hướng đối tượng: association, inheritance, polymorphism, composition và collections. Hibernate cho phép bạn thực hiện các câu truy vấn dữ liệu bằng cách sử dụng ngôn ngữ SQL mở rộng của Hibernate (HQL) hoặc là ngôn ngữ SQL nguyên thuỷ cũng như là sử dụng các API.

Không giống như các persistence layer khác, Hibernate không ẩn đi sức mạnh của ngôn ngữ SQL khỏi bạn mà Hibernate còn đảm bảo cho bạn việc bạn đầu tư vào công nghệ và tri thức cơ sở dữ liệu quan hệ là luôn luôn chính xác. Và điều quan trọng hơn nữa là Hibernate được license theo LGPL (Lesser GNU Public License). Theo đó, bạn có thể thoải mái sử dụng Hibernate trong các dự án open source hoặc các dự án thương mại (commercial).

Hibernate là một dự án open source chuyên nghiệp và là một thành phần cốt tuỷ của bộ sản phẩm JBoss Enterprise Middleware System (JEMS). JBoss, như chúng ta đã biết là một đơn vị của Red Hat, chuyên cung cấp các dịch vụ 24x7 về hỗ trợ chuyên nghiệp, tư vấn và huyấn luyện sẵn sàng hỗ trợ bạn trong việc dùng Hibernate.

Các thành phần của Hibernate project:

* Hibernate Core: Cung cấp các chức năng cơ bản của một persistence layer cho các ứng dụng Java với các APIs và hỗ trợ XML mapping metadata.
* Hibernate Annotations: Các map class với JDK 5.0 annotations, bao gồm Hibernate Validator.
* Hibernate EntityManager: Sử dụng EJB 3.0 EntityManager API trong JSE hoặc với bất kỳ JEE server nào.
* Hibernate Tools: Các tool tích hợp với Eclipse và Ant dùng cho việc sinh ra các persistence object từ một schema có sẵn trong database (reverse-engineering) và từ các file hbm sinh ra các class java để hiện thực các persistence object, rồi Hibernate tự tạo các object trong database (forward-engineering).
* NHibernate: Hibernate cho .Net framework.
* JBoss Seam: Một Java EE 5.0 framework cho phát triển các ứng dụng JSF, Ajax và EJB 3.0 với sự hỗ trợ của Hibernate. Seam hiện rất mới và tỏ ra rất mạnh để phát triển các ứng dụng Web 2.0. Nó tích hợp đầy đủ tất cả các công nghệ "hot" nhất hiện nay.

Theo : http://my.opera.com/mattroiden3012/blog/tong-quan-hibernate-framework

Thứ Bảy, 17 tháng 10, 2009

20課_生活と仕事_Reading






















問 グラフの説明として正しいものはどれか。
1.20代以下では、「どちらかといえば生活重視」
と答えた人が5割を超え、「生活重視」と答えた人の割合と合わせると、全体の8割に達する。
 わかるのがいいですか?
 20代以下では「どちらかといえば生活重視」と答えた人=47%==>5割を超えない。番1:incorrect.m 
「どちらかといえば生活重視」と答えた人+「生活重視」と答えた人= 47%+16%=63%===>全体の8割に達する:INCORRECT 
1. incorrect you are correct.
2.30代では、「どちらかといえば生活重視」と答えた人が3割以上となっており、「生活重視」と答えた人は2割強となっている。
「どちらかといえば生活重視」と答えた人が3割以上~36%: correct 
生活重視」と答えた人は2割強となっている >16% :INCORRECT 
2. incorrect you are correct.

3.30代では、「どちらかといえば仕事重視」と答えた人が4割と最も割合が大きいものの、「仕事重視」と答えた人の割合と合わせても全体の半分に満たない。
「どちらかといえば仕事重視」と答えた人が4割と最も割合が大きいもの=40%:correct 
「仕事重視」と答えた人の割合と合わせても全体の半分に満たない: 40%+7%=47%<50% size="5" color="#000000">○
3. correct どちらかといえば仕事重視=41% +仕事重視(7%)=48%
        you are correct.
4.40代では、「どちらかといえば仕事重視」と答えた人が6割を超え、「仕事重視」と答えた人の割合と合わせると、全体の9割に達する。
「どちらかといえば仕事重視」と答えた人が6割を超え:55%<60%:incorrect  
「仕事重視」と答えた人の割合と合わせると: 55%+9%=64% <90%: size="5" color="#000000">○