ここのunique制約はつけておくほうが良い習慣かもね。程度かと。付けないと1対1にならないように読めるけど。そうではない。
uniqueの効果としては例えば次のようなコードがあった場合、unique属性がないともんだなく動作する。

    def nose = new Nose()
    new Face(name: "face1", nose: nose).save(flush: true, failOnError: true)
    new Face(name: "face2", nose: nose).save(flush: true, failOnError: true)

sql的には以下の様な動き

    insert into face (id, name) values (1, 'face1');
    insert into nose (id, face_id) values (1, 1);
    insert into face (id, name) values (2, 'face2');
    update nose face_id=2 where id=1;

最初にインサートしたface1を指すnoseがいなくなるという事が起きる。uniqueをつけると二個目のfaceを保存しようした時点でこける。ただ現状こけ方が良くなくて

    org.h2.jdbc.JdbcSQLException: Parameter "#1" is not set; SQL statement:
    /* criteria query */ select this_.id as id0_0_, this_.version as version0_0_, this_.name as name0_0_ from face this_ where this_.id=?  [90012-164]

みたいなかなり低レベルのところのエラーが落ちる。
てかそもそもOneToOneの時にface側でnoseのunique制約つけなくちゃいけないんだよ。というところがしっくりきていない。なぜかというかOneToOneの時はfaceテーブルにnose_idが存在するわけではいので、unique制約の意味がわからない。

hasOneを使用せずに最初のmany-to-oneで双方向関連を貼った場合はfaceテーブルにnose_idができるので、Faceクラスでnoseに対してuniqueを設定することによりnose_idがユニークなり、これでも1対1が実現できることになる。なのでこの場合はunique制約が意味がある。バリデーションもちゃんと機能する(上のように低レベルな例外にならない)。

なんか色々意味をが混同されてしまっていると思うのだよね。

長くなったけど、たぶんGrails本体の動作と、ドキュメントがいけてない。あとは任せた :heart: