Hibernate IntelliJ M2M Вставка не работает - PullRequest
0 голосов
/ 29 сентября 2019

Я пытаюсь сопоставить отношения «многие ко многим» между категориями и элементами.Но когда я вставляю категорию в объект, модульный тест никогда не заканчивается, и я не могу понять, на что ссылается вывод:

Ошибка:

Причина: org.hibernate.PropertyValueException: свойство not-null ссылается на нулевое или временное значение: model.repository.entities.CategoryEntity.name

Я использую hiberate исключительно для создания базы данных, и я запускаю базу данных в контейнере докера,

Код:

Конфигурация гибернации, persitence.xml:

<persistence-unit name="org.hibernate.lab1_web_shop.jpa"  transaction-type="RESOURCE_LOCAL">
    <properties>
        <property name="hibernate.connection.driver_class" value="com.mysql.cj.jdbc.Driver"/>
        <property name="hibernate.connection.url" value="jdbc:mysql://192.168.99.100:32772/DB_WEB_SHOP"/>
        <property name="hibernate.connection.autocommit" value="false"/>
        <property name="hibernate.connection.username" value="remoteuser"/>
        <property name="hibernate.connection.password" value="remotepassword"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
        <property name="hibernate.connection.CharSet" value="utf8"/>
        <property name="hibernate.connection.characterEncoding" value="utf8"/>
        <property name="hibernate.connection.useUnicode" value="true"/>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.hbm2ddl.auto" value="update"/>
        <!-- Scan for annotated classes and Hibernate mapping XML files -->
        <property name="hibernate.archive.autodetection" value="class, hbm"/>
    </properties>
</persistence-unit>

CategoryEntity

    @Entity
@Table(name = "Categories")
@NamedQueries({
        @NamedQuery(name = "Category.findAll", query = "SELECT c FROM  CategoryEntity c"),
        @NamedQuery(name = "Category.findById", query = "SELECT c FROM  CategoryEntity c WHERE c.id = :id"),
        @NamedQuery(name = "Category.findByName", query = "SELECT c FROM  CategoryEntity c WHERE c.name = :name"),
        @NamedQuery(name = "Category.deleteById", query = "DELETE FROM CategoryEntity c WHERE c.id =:id")
})
public class CategoryEntity  implements EntityInt {

    @Id
    @GeneratedValue(generator = "incrementor")
    @Column(name = "category_id", unique = true)
    public int id;

    @Column(name = "name", nullable = false, unique = true)
    public String name;

    @Column(name = "ts")
    public Date timestamp;

    @ManyToMany(cascade = {CascadeType.ALL})
    @JoinTable(
            name = "Category_Item",
            joinColumns = {@JoinColumn(name = "category_id")},
            inverseJoinColumns = {@JoinColumn(name = "item_id")}
    )
    public List<ItemEntity> items = new ArrayList<>();

}

ItemEntity

@Entity
@Table(name = "Items")
public class ItemEntity implements EntityInt {

    @Id
    @GeneratedValue(generator = "incrementor")
    @Column(name = "item_id", unique = true)
    public int id;

    @Column(name = "name", unique = true, nullable = false)
    public String name;

    @Column(name = "price", nullable = false)
    public Integer price;

    @Column(name = "quantity", nullable = false)
    public Integer quantity;

    @ManyToMany(mappedBy = "items")
    private List<CategoryEntity> categories = new ArrayList<>();
}

Доступ к базе данных:

public class CategoriesDB extends AbstractDB {

    public static boolean insert(CategoryEntity entity) throws Exception {
        EntityManagerFactory factory = getEntityManagerFactory();
        EntityManager em = factory.createEntityManager();
        try {
            em.getTransaction().begin();
            List<CategoryEntity> resultList = em.createNamedQuery(QUERY_FIND_BY_NAME)
                    .setParameter("name", entity.name)
                    .getResultList();
            if (resultList.size() == 0) {
                em.persist(entity);
                em.getTransaction().commit();
                return true;
            }
            em.getTransaction().commit();
            return false;
        } catch (Exception e) {
            e.printStackTrace();
            em.getTransaction().rollback();
            throw new Exception(e);
        } finally {
            em.close();
        }
    }
}

Наконец, прежде чем я добавил логику ManyToMany к сущности, вставка работала нормально.Также у вставляемой категории нет связанных элементов.

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