Spring boot + Web mvc + JPA с использованием CrudRepository, вызывающий проблему при вставке строки с использованием метода save, вызывающего EntityExistsException - PullRequest
0 голосов
/ 20 февраля 2019

Среди операции CRUD Create выдает ошибку " Другой объект с таким же значением идентификатора уже был связан с сеансом " Остальное все (чтение, обновление и удаление) работает нормально.

Я использую oracle sql в качестве базы данных, и есть еще одна сущность продукта с многозначным сопоставлением с классом категорий. EntityClass

@Entity
public class Categories {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    private String name;

    public Categories() {
        super();
    }

    public Categories(Integer id,String name) {
        this.id=id;
        this.name=name;
    }
    public Categories(String name) {

        this.name=name;
    }
//with setters and getters
}

Страница JSP

<body onload="document.getElementById('name').disabled = true;document.getElementById('hidden').disabled = true;">

    <div align="center">
        <h4>Add or Modify or Delete Categories</h4>
        <form:form method="POST" action="/categories" modelAttribute="categories">
            <table>
                <tr>
                    <td><form:label path="name">Name</form:label></td>
                    <td>

                        <form:select path="name">
                            <form:option value="NONE" label="Select" />
                            <form:options items="${categoriesList}" />
                        </form:select>

                    </td>   
                </tr>
                <tr>
                    <td>Operations</td>
                    <td>
                        <input type="radio" name="Ops" value="Add" checked="checked" onclick="document.getElementById('name').disabled = true; document.getElementById('newName').disabled = false;document.getElementById('hidden').disabled = true;">Add</input><br/>
                        <input type="radio" name="Ops" value="Modify"  onclick="document.getElementById('name').disabled = false; document.getElementById('newName').disabled = false;document.getElementById('hidden').disabled = true;">Modify</input><br/>
                        <input type="radio" name="Ops" value="Delete"  onclick="document.getElementById('name').disabled = false; document.getElementById('newName').disabled = true;document.getElementById('hidden').disabled = false;">Delete</input><br/>                   
                    </td>
                </tr>
                <tr>
                    <td>Name</td>
                    <td><input type="text" name="newName" id="newName"/>
                        <input type="hidden" id="hidden" name="newName" value="dummy"/>
                    </td>
                </tr>
                <tr>
                    <td colspan="2"><input type="submit" value="Submit" /></td>
                </tr>
            </table>
        </form:form>
    </div>
</body>

Класс контроллера

    @Controller
public class CategoriesController {
    @Autowired
    private CategoriesService cservice;

    @RequestMapping(value = "/categories", method = RequestMethod.GET)
    public ModelAndView categories() {
        // view name  model 
        ModelAndView modelAndView = new ModelAndView("categories", "categories", new Categories());
        return modelAndView;
    }

    @RequestMapping(value = "/categories", method = RequestMethod.POST)
    public String  opsOnCategories(@ModelAttribute("categories") Categories cat,@RequestParam("Ops") String ops,@RequestParam("newName") String name) 
    {
        if(ops.equals("Modify"))
        {
            cservice.modifyCategory(new Categories(Integer.parseInt(cat.getName()), name));
        }else if(ops.equals("Add"))
        {
            cservice.addCategory(new Categories(name));
        }else 
        {
            cservice.deleteCategory(Integer.parseInt(cat.getName()));
        }

        return "categories";
    }


    @ModelAttribute("categoriesList")
       public Map<String, String> getCategoryList() {
          Map<String, String> categoriesList = new HashMap<String, String>();
          List<Categories> ls=cservice.getAll();
          for(int i=0;i<ls.size();i++)
          {
              categoriesList.put(ls.get(i).getId().toString(), ls.get(i).getName());
          }
          return categoriesList;
       }
}

Может кто-нибудь, пожалуйста, помогите в этом.

Предыдущий, из-за которого произошла ошибка

insert into CATEGORIES(ID,NAME) values (1,'Mobile');
insert into CATEGORIES(ID,NAME) values (2,'Laptop');

** Изменения, внесенные для устранения ошибки *

insert into CATEGORIES(ID,NAME) values (hibernate_sequence.nextval,'Mobile');
insert into CATEGORIES(ID,NAME) values (hibernate_sequence.nextval,'Laptop');

1 Ответ

0 голосов
/ 20 февраля 2019

Мое первоначальное предположение - что-то не так с @Id @GeneratedValue, в частности с Oracle Database.

Есть несколько вещей, которые вы можете сделать:

1- Попробуйте подключиться к любомудругой тип базы данных просто для проверки функциональности - чтобы вы могли исключить, что не имеет значения

2 - Попробуйте использовать @ org.springframework.data.annotation.Id вместе с @Id персистентности javax

Что-то похожее на это

@Id
@org.springframework.data.annotation.Id
private Integer id;

3- Создайте класс, который генерирует случайные целочисленные идентификаторы, и обращайтесь к нему с помощью аннотаций (@GenericGenerator & @GeneratedValue)

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