2012-06-27 4 views
2

Представьте, что отношение к почтовому индексу относится к городу. (Для простоты не используя иностранные клавиатурные)Hibernate - автоматический и общий способ проверить, существует ли определенное ограничение уникального ключа?

<class name="CityToPostalcode" table="city_to_postalcode" catalog="database"> 
    <id name="id" type="java.lang.Integer"> 
     <column name="id" /> 
     <generator class="identity" /> 
    </id> 
    <property name="city" type="String"> 
     <column name="city" not-null="true"/> 
    </property> 
    <property name="postalcode" type="Integer"> 
     <column name="postalcode" not-null="true"/> 
    </property> 
    <properties name="businessKey" unique="true"> 
     <property name="city"/> 
     <property name="postalcode"/> 
    </properties> 
</class> 

Есть функция в рамках, чтобы проверить, если уникальный ключ «businessKey» для данной комбинации является уникальным (также для одноколоночных уникальных ограничений)?

Возможно, в сочетании отображения «businessKey» с классом? (Подобно использованию составного идентификатора)

Это просто избыток, чтобы написать код для каждой таблицы, чтобы проверить его бизнес-ключ, если он определенно может быть выполнен автоматически.

+1

объект посмотреть на '@ naturalid', который с omparable to '@ id' – Firo

ответ

1

natural Id, который автоматически создает уникальное ограничение на создание схемы и может быть использован для более эффективного запроса. в XML

<natural-id> 
    <property name="name"/> 
    <property name="org"/> 
</natural-id> 

naturalids использовать кэш второго уровня более эффективен и с H4.1 на нагружении naturalid использует первый кэш уровня и может сэкономить туда и обратно. Кроме этих естественных идентификаторов, как обычные свойства. Вы могли бы, однако написать общую естественный идентификатор проверку

  1. создать новый объект со свойствами установить
  2. доступ через SessionFactory в classmetadata объекта
  3. итерации природных свойств идентификаторов и использовать их, чтобы получить значение от вашего объекта и установить их на использовании (ИмяСвойства, PropertyValue)
  4. если что-то можно найти скопировать данные, иначе просто сохранить только что созданный
+0

Спасибо за информацию с помощью ClassMetadata! – djmj

+0

В некоторых редких случаях при транзакциях с множественным чтением и сохранением поиска по натуральному идентификатору извлекается прокси со всеми значениями, равными нулю, а Hibernate.initialize() все еще не устанавливает значения! Похоже на ошибку. – djmj

 Смежные вопросы

  • Нет связанных вопросов^_^