Использование не-первичного ключа для свойства объекта в GORM? - PullRequest
1 голос
/ 01 февраля 2011

Возможно ли иметь доменный объект с полем, которое ссылается на неосновной ключ на другом объекте (я работаю над устаревшей базой данных).

У меня есть flea_name, а не flea_id (который является первичным ключом).Есть ли способ заставить GORM автоматически извлекать соответствующий блошиный объект из блошиной таблицы на основе неосновного уникального ключа (например, имени, кода и т. Д.), А не его идентификатора?Такие как:

  class Flea {
       def id //This is the primary key in the table
       def name //This is a unique key
    }

    class Puppy {
        def flea //This is stored as the flea's unique, but non-primary,
                 // name in the puppy table
                 //The puppy table has a flea_name, not a flea_id, as would be expected
        static mapping = {
            flea column: 'flea_name'//This will point to the flea's name, 
                                    //but I want to hydrate it to be a Flea
        }
    }

Заранее спасибо

Ответы [ 5 ]

2 голосов
/ 02 февраля 2011

короткий ответ: вы не делаете это таким образом.

вы позволяете grails использовать идентификатор для связи объектов в базе данных.затем, если вам нужен доступ к имени блох, вы можете переопределить его метод toString(), чтобы вернуть имя блох.или вы получаете доступ к этому свойству, как и любой другой в контроллерах / службах или gsps.

2 голосов
/ 02 февраля 2011

Возможно, вы захотите взглянуть на [Custom ORM Mapping] [1]

Пример:

class Flea {
   def id
   def name
}

class Puppy {
      static hasMany = [fleas:Flea]

    static mapping = {
      table 'puppy'
      name column:'puppy_name'
  fleas column:'flea_name'
    }
}

P / s: извините, потому что в ссылке есть место, это: http://grails.org/doc/1.0.x/guide/single.html#5.5.2 Пользовательское сопоставление ORM

[1]: http://grails.org/doc/1.0.x/guide/single.html#5.5.2 Пользовательское сопоставление ORM

2 голосов
/ 02 февраля 2011

Можете ли вы уточнить, почему вы хотите это сделать? Если объектные отношения действительно таковы, что у Щенка есть Блоха, то вы действительно хотите связать через Id как обычно.

Однако, если вы на самом деле имеете в виду, что у щенка много блох, то у него будет либо набор отдельных блох, либо, скорее всего, в этом случае вам не нужны здесь отношения, а у щенка есть числовое поле, идентифицирующее количество имеющихся у него блох.

Как это звучит?

0 голосов
/ 10 февраля 2011

Если Flea постоянно используется таким образом, другими словами, он не является единичным.Таким образом, таблица Person также имеет имя flea_name в качестве внешнего ключа, почему бы не

static mapping = {
    id generator: 'assigned', name: 'name'
}

В зависимости от используемой версии Hibernate / Grails, вы можете потерять доступ к фактическому столбцу id.

Или, если это единственный случай, вы можете поменять Puppy

class Puppy{
    String fleaName

    static transients = ['flea']

    Flea getFlea() {
        Flea.findByName(fleaName)
    }
}
0 голосов
/ 10 февраля 2011

Итак, после некоторых исследований я пришел к выводу, что эта функция невозможна в Grails.

Я попытался сопоставить через flea_name, но выдается исключение при попытке получить новый объект.

Обходной путь, который я использовал для этого, заключается в создании метода:

def getFlea() {
    Flea.findByName(flea)
}
...