Я пытаюсь сопоставить отношения «многие ко многим» между категориями и элементами.Но когда я вставляю категорию в объект, модульный тест никогда не заканчивается, и я не могу понять, на что ссылается вывод:
Ошибка:
Причина: 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 к сущности, вставка работала нормально.Также у вставляемой категории нет связанных элементов.