DataIntegrityViolationException, когда я изменяю переменную List на ArrayList - PullRequest
0 голосов
/ 18 октября 2010

У меня есть проект grails, который выдает следующее исключение:

org.springframework.dao.DataIntegrityViolationException: could not delete: [Role#4]; SQL [delete from role where id=? an
d version=?]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not del
ete: [Role#4]

В моем домене ролей все, что я делал для создания этой ошибки, это изменение определения одной из переменных с

 List<RoleTool> roleTools = new ArrayList<RoleTool>()

до

ArrayList<RoleTool> roleTools = new ArrayList<RoleTool>()

Почему это так?

1 Ответ

1 голос
/ 19 октября 2010

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

Я не совсем уверен, что здесь происходит, но Hibernate имеет свои собственные классы коллекций, которые он использует для отображаемых коллекций, наиболее часто используемые это org.hibernate.collection.PersistentList и org.hibernate.collection.PersistentSet. Они реализуют интерфейсы List и Set соответственно, но не расширяют ArrayList или HashSet или какую-либо типичную конкретную коллекцию. Вместо этого они являются внутренними классами Hibernate, которые отслеживают изменения, чтобы помочь в обнаружении ошибок при сохранении, сбросе и т. Д.

Хорошо объявить начальную коллекцию как ArrayList, так как она читается только при сохранении (хотя это Groovy, поэтому намного проще использовать List<RoleTool> roleTools = []). Но Hibernate нуждается в гибкости реализации интерфейса List / Set при загрузке постоянных экземпляров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...