2012-07-20 42 views
8

Tôi cố gắng để xác định mối quan hệ 1-1 trong 2 cách khác nhau:
Grails 2.0.3Grails 1-1 mối quan hệ

Trường hợp 1:

class Car { 
    String model 
    Engine eng 
    static constraints = { 
     eng unique: true 
    } 
} 

class Engine { 
    Double capacity 
    static belongsTo = [car : Car] 
} 

Trường hợp 2:

class Car { 
    String model 
    static hasOne = [eng : Engine] 
    static constraints = { 
     eng unique: true 
    } 
} 


class Engine { 
    Double capacity 
    static belongsTo = [car : Car] 
} 

trông giống nhau và cả hai cung cấp ánh xạ một chiều một chiều. Thật không may DB có cấu trúc khác nhau trong cả hai trường hợp.

Trường hợp 1: enter image description here

Trường hợp 2: enter image description here

Tại sao khi xe hơi và một lần cơ giữ liên kết đến bảng thứ hai.

Sự cố của tôi ở đâu? Khi tôi nhìn vào mã, từ quan điểm DDD, cả hai trường hợp đều cho rằng lớp Car là quan trọng hơn và Car aggregates Engine. Thật không may khi tôi nhìn từ phía DB về trường hợp 2 Tôi thà nói rằng nó là đối diện - Engine aggregate Car. Tất nhiên tôi có thể sử dụng phương pháp tiếp cận đầu tiên, nhưng hầu hết các ấn phẩm tôi đã thấy về grails, hiện tại cách thứ hai để xác định mối quan hệ. Có lẽ tôi đã hiểu lầm điều gì đó và tôi sử dụng hasOne theo cách sai?

Trả lời

13

Các documentation on hasOne bang rằng việc sử dụng điều này tạo ra một mối quan hệ hai chiều một chiều, trong đó khóa ngoại ở trên đứa trẻ.

belongsTo có nghĩa là các hành động được thực hiện trên cấp độ gốc (ví dụ: lưu và cập nhật) sẽ được xếp chồng theo chế độ ngủ đông cho trẻ.

Vì vậy, nếu bạn muốn khóa ngoại là Engine hãy sử dụng static hasOne = [engine:Engine] trên Car.

Nếu bạn muốn khóa ngoại là Car thì hãy sử dụng Engine engine trên Car.

Trong cả hai trường hợp sử dụng belongsTo = [car: Car] trên Engine

-1

Tôi nghĩ bạn nên cố gắng thực hiện điều này.

class Car { 
     String model 
     Engine engine 
     static constraints = { 
      eng unique: true 
     } 
    } 


    class Engine { 
     Double capacity 
     Car car 
    } 

Tôi nghĩ điều đó sẽ làm được. Bạn có thể đọc tại đây:

Theo mặc định, liên kết địa chỉ sẽ ánh xạ tới cột khóa ngoài được gọi là address_id.

http://grails.org/doc/latest/guide/GORM.html

trên Mappings


-để Nhiều-One/One-to-One Hy vọng nó sẽ giúp :)

+0

Tôi không chắc chắn, nhưng là đây là cách đúng đắn để lập bản đồ .... vì động cơ động cơ giống Nhiều-to-one và sau đó thiết lập các hạn chế đối với độc đáo ...Nó có làm bất kỳ điểm nào không? Bạn có thể đi với hasOne của họ ... –

Các vấn đề liên quan