2012-07-11 32 views
6

Tôi đã mô hình hóa các lớp miền của tôi trong Grails với kế thừa như được hiển thị bên dưới.Grails/Groovy miền lớp thừa kế đúc

abstract class Profile{ 
} 

class Team extends Profile{ 
} 

class User extends Profile{ 
} 

class B{ 
    static hasMany = [profiles: Profile] 
} 

Sau đó trong bộ điều khiển khi nhận được tất cả cấu hình từ lớp B trong một số trường hợp, tôi không thể vì tôi nhận được java. lang.ClassCastException hoặc GroovyCastException, mặc dù chúng được lưu dưới dạng Nhóm hoặc Người dùng (với lớp thuộc tính trong cơ sở dữ liệu). Dưới đây là những cách tôi đã thử:

def team1 = b.profiles.toList()[0] as Team 

def team1 = (Team)b.profiles.toList()[0] 

Nó hoạt động khi tôi không viết bất kỳ loại nào chỉ sử dụng như ngôn ngữ động thông thường.

def team1 = b.profiles.toList()[0] 

Nhưng sau đó tôi không bao giờ biết mình đang sử dụng lớp nào. Có anyway trong groovy hoặc gorm để đúc lớp cha mẹ cho con?

+0

Không có [phân biệt] (http://grails.org/doc/latest/ref/Database%20Mapping/discriminator.html) cho GORM phải lựa chọn giữa ' User' hoặc 'Team'. Làm thế nào nên gorm quyết định thực hiện để sử dụng? – krock

+0

Nó lưu vào cùng một bảng trong cơ sở dữ liệu với thuộc tính lớp cho biết lớp đó là gì. – sgleser87

Trả lời

4

Câu trả lời là Không là phiên bản GORM/Hibernate thực sự là đối tượng được ủy quyền. Vì vậy, nó không thể được đưa vào một lớp thực thể trực tiếp.

Dù sao điều này có thể giúp:

def team1 = b.profiles.toList()[0] 
if(team1.instanceOf(Team)) { 
    // I am an instance of Team 
    // do something here. 
} 
+0

Nó đang hoạt động, nhưng thực sự đó không phải là câu hỏi của tôi. Câu hỏi của tôi là nếu có một cách để đưa lớp cơ sở vào lớp con một cách rõ ràng. – sgleser87

+3

Không, vì proxy hibernate không nhất thiết phải là một 'instanceof' lớp con theo nghĩa Java của từ đó. Lớp proxy là lớp con được tạo động của loại _declared_ của 'b.profiles' (tức là' Hồ sơ'). [Bài viết này] (http://blog.springsource.org/2010/07/28/gorm-gotchas-part-3/) có các chi tiết đẫm máu, và nó (và các bài viết khác trong cùng một chuỗi) cũng đáng một đọc. –

+3

Luôn luôn có 'GrailsHibernateUtil.unwrapIfProxy', sẽ loại bỏ trình bao bọc proxy và cung cấp cho bạn đối tượng thực (sau đó bạn có thể truyền) nhưng điều này sẽ phải nhấn vào cơ sở dữ liệu nếu đối tượng thực chưa được tải. –