[英]Why am I getting a null value? (HIBERNATE, SPRING)
Why does Hibernate detect null values when I am trying to add a new object? 在尝试添加新对象时,Hibernate为什么会检测空值? I have a Product class that has a field object Category.
我有一个具有字段对象类别的Product类。 Category in Product is stored in the database as category_id.
产品中的类别作为category_id存储在数据库中。 Here is my Product class.
这是我的产品类。
@Entity
@Table(name = "PRODUCT")
public class Product implements java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private long id;
private String upc;
private Category category;
private String name;
private String description;
private BigDecimal price;
public Product(){
}
public Product(String upc){
this.upc = upc;
}
public Product(String upc, String name, BigDecimal price){
this.upc = upc;
this.name = name;
this.price = price;
}
public Product(String upc, Category category, String name, String description, BigDecimal price) {
super();
this.upc = upc;
this.category = category;
this.name = name;
this.description = description;
this.price = price;
}
public void setId(long id) {
this.id = id;
}
@Id @GeneratedValue
@Column(name = "id")
public long getId() {
return id;
}
@Column(name = "upc", nullable = false)
public String getUpc() {
return upc;
}
public void setUpc(String upc) {
this.upc = upc;
}
@ManyToOne @NotNull
@JoinColumn(name = "category_id", referencedColumnName = "category_id")
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
@Column(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(name = "description")
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Column(name = "price")
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
}
And here is my Category class: 这是我的类别类:
@Entity
@Table(name = "CATEGORY")
public class Category implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private long id;
private String categoryId;
private String name;
private Set<Product> products;
public Category(){}
public Category(String categoryId, String name) {
super();
this.categoryId = categoryId;
this.name = name;
}
public void setId(long id) {
this.id = id;
}
@Id @GeneratedValue
@Column(name = "id")
public long getId() {
return id;
}
@Column(name = "category_id")
public String getCategoryId() {
return categoryId;
}
public void setCategoryId(String categoryId) {
this.categoryId = categoryId;
}
@Column(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@OneToMany
@JoinColumn(name = "category_id", insertable = false, updatable = false)
public Set<Product> getProducts() {
return products;
}
public void setProducts(Set<Product> products) {
this.products = products;
}
}
Now, when I am using the session.save(product) method, it gets a null value for the Category field but when using native sql in runs perfectly. 现在,当我使用session.save(product)方法时,它为Category字段获取了一个空值,但是当使用本机sql时,它可以完美运行。 I tried to print the category id and its there.
我尝试在其中打印类别ID及其名称。 Here is my code for add product:
这是我添加产品的代码:
@Override
public void addProduct(Product product) {
System.out.println(product.getCategory().getCategoryId());
Session session = sessionFactory.openSession();
Transaction transaction = null;
try {
transaction = session.beginTransaction();
// Query query = session.createSQLQuery(DAOQuery.HQL_ADD_PRODUCT).setParameter("upc", product.getUpc())
// .setParameter("category", product.getCategory().getCategoryId())
// .setParameter("name", product.getName()).setParameter("description", product.getDescription())
// .setParameter("price", product.getPrice());
//
// query.executeUpdate();
session.save(product);
transaction.commit();
} catch (HibernateException e) {
if (transaction != null)
transaction.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
Here is the error: 这是错误:
WARN: SQL Error: 1048, SQLState: 23000
Oct 20, 2016 8:30:15 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Column 'category_id' cannot be null
org.hibernate.exception.ConstraintViolationException: could not execute statement
at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:112)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:207)
at org.hibernate.dialect.identity.GetGeneratedKeysDelegate.executeAndExtract(GetGeneratedKeysDelegate.java:57)
at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:42)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2840)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3411)
at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81)
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:597)
at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:232)
at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:213)
at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:256)
at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:318)
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:275)
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:182)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:113)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192)
at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177)
at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32)
at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73)
at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:667)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:659)
at org.hibernate.internal.SessionImpl.save(SessionImpl.java:654)
at com.qbryx.dao.ProductDaoHQLImpl.addProduct(ProductDaoHQLImpl.java:138)
at com.qbryx.service.ManagerServiceImpl.addProduct(ManagerServiceImpl.java:24)
at com.qbryx.controller.ManagementController.createProduct(ManagementController.java:62)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:180)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.springframework.orm.hibernate5.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:151)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1100)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:687)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
Caused by: java.sql.SQLException: Column 'category_id' cannot be null
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2975)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1600)
at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1129)
at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:681)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1368)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1283)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1268)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:204)
... 63 more
I cant seem to find what's wrong. 我似乎找不到任何问题。 I need help.
我需要帮助。 Thanks.
谢谢。
The error says that categoryId
is null, while your database is configured to be not null. 该错误表明
categoryId
为null,而您的数据库配置为非null。
You tagged id
with @Id @GeneratedValue
and Hibernate generate a new long value for that, but if you don't provide a value for categoryId it won't be generated. 您使用
@Id @GeneratedValue
标记了id
,并且Hibernate为此生成了一个新的long值,但是如果您不为categoryId提供值,则不会生成该值。
You should either move the @Id @GeneratedValue
to categoryId
or provide a value when you build it. 您应该将
@Id @GeneratedValue
移到categoryId
或在构建它时提供一个值。
Furthermore, I suggest you to review your design, because it's confusing to have both id
and categoryId
in your class; 此外,我建议您回顾一下您的设计,因为在类中同时包含
id
和categoryId
令人困惑。 at the end of the day everybody will refer to the property id
as "category id` and you won't know if they're referring to that id or to "categoryId". 最终,每个人都将属性
id
称为“类别id
”,您将不知道他们是在指该ID还是“类别ID”。
You did not provide the proper strategy for generating Id for category. 您没有提供生成类别ID的正确策略。
If your database uses sequences, you can map id as: 如果您的数据库使用序列,则可以将id映射为:
@GeneratedValue(strategy = GenerationType.IDENTITY)
Or create generation stragedy if it doesn't 或者,如果没有的话,创造一代的悲剧
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "category_generator")
@SequenceGenerator(name="category_generator", sequenceName = "category_seq")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.