Как добавить первую сущность рекурсивного ненулевого отношения?
Проблема возникает при попытке использовать мою контрольную защиту по умолчанию (EntityListener) для пользовательских сущностей. Hibernate не может вставить первого пользователя. Пример упрощения ситуации:
@Entity
class User {
@Id @GeneratedValue
private Long id;
@Basic
private String name;
@ManyToOne(optional=false)
@JoinColumn(nullable=false,updatable=false)
private User createdBy;
// getters & setters
// equals & hashcode are based on name
}
И я пробовал что-то вроде:
User user = new User();
user.setName( "Some one" );
user.setCreatedBy( user );
Hibernate не работает, и корневое исключение:
com.microsoft.sqlserver.jdbc.SQLServerException: Cannot insert the value NULL into
column 'createdby_id', table 'mydb.user'; column does not allow nulls. INSERT fails.
Я знаю несколько обходных путей: вставьте первую сущность вручную (вставка SQL) или установите значение nullable = true. Во-первых, это просто раздражает, а во-вторых, это точка отказа целостности (требуется настраиваемый прослушиватель аудита и триггер базы данных). Есть варианты получше? Или, другими словами: есть ли решение только для JPA?
Моя платформа: SQL Server 2008 и Hibernate 3.6 в качестве поставщика JPA2.
Изменить: сначала я использовал persist()
. Я попробовал merge()
, что могло дать более разумное предположение, но без разницы. И я тоже пробовал CascadeType.MERGE
.