我有以下User
实体。
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="user_id")
private int id;
@Embedded
private Person person;
@Column(columnDefinition = "VARCHAR(255)")
private String image;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="user_group_id")
private UserGroup userGroup;
// Some getters and setters ommitted
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public UserGroup getUserGroup() {
return userGroup;
}
public void setUserGroup(UserGroup userGroup) {
this.userGroup = userGroup;
}
以及以下可嵌入的Person
实体。
@NotNull
@Column(name="firstname", nullable = false, columnDefinition = "VARCHAR(32)")
private String firstName;
@NotNull
@Column(name="lastname", nullable = false, columnDefinition = "VARCHAR(32)")
private String lastName;
@NotNull
@Column(nullable = false, columnDefinition = "VARCHAR(96)")
private String email;
@NotNull
@Column(nullable = false, columnDefinition = "VARCHAR(24)")
private String telephone;
@NotNull
@Column(nullable = false, columnDefinition = "VARCHAR(255)")
private String password;
@Column(nullable = false, columnDefinition = "TINYINT(1) DEFAULT 1")
private boolean status;
@Column(name = "date_added", nullable = false, updatable=false, columnDefinition = "DATETIME DEFAULT CURRENT_TIMESTAMP")
@Temporal(value = TemporalType.TIMESTAMP)
private Date dateAdded;
以及以下UserGroup
实体。
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="user_group_id")
private int id;
@NotNull
@Column(nullable = false, columnDefinition = "VARCHAR(20)")
private String name;
@NotNull
@Column(nullable = false, columnDefinition = "TEXT")
private String permission;
@OneToMany(mappedBy="userGroup",
cascade={CascadeType.PERSIST, CascadeType.MERGE},
fetch = FetchType.LAZY)
private List<User> users = new ArrayList<User>();
// Getters and Setters ommitted
我已经在数据库中建立了几个用户组。添加新用户时,我检索了一个特定的组,并希望将其分配给新用户。我使用以下代码来做到这一点。
Session session = HibernateHelper.getSessionFactory().openSession();
UserGroup userGroup = (UserGroup) session.createQuery("FROM UserGroup UG WHERE UG.id = :user_group_id")
.setParameter("user_group_id",Integer.parseInt(group))
.getSingleResult();
Transaction tx = session.getTransaction();
tx.begin();
User user = new User();
user.setPerson(new Person());
user.getPerson().setFirstName(firstName);
user.getPerson().setLastName(lastName);
user.getPerson().setEmail(email);
user.getPerson().setTelephone(telephone);
user.getPerson().setPassword(hashedPassword);
user.setUserGroup(userGroup); // Assign the new user this group
session.save(user);
tx.commit();
session.close();
但是我得到了例外:org.hibernate.exception.ConstraintViolationException
正确的方法是什么?
我正在使用在wildfly服务器上运行的servlet开发Web应用。
错误堆栈跟踪:
org.hibernate.exception.ConstraintViolationException: could not execute statement
at deployment.shopping_cart.war//org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:59)
at deployment.shopping_cart.war//org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
at deployment.shopping_cart.war//org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)
at deployment.shopping_cart.war//org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)
at deployment.shopping_cart.war//org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:200)
at deployment.shopping_cart.war//org.hibernate.dialect.identity.GetGeneratedKeysDelegate.executeAndExtract(GetGeneratedKeysDelegate.java:57)
at deployment.shopping_cart.war//org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:43)
at deployment.shopping_cart.war//org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3153)
at deployment.shopping_cart.war//org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3759)
at deployment.shopping_cart.war//org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:84)
at deployment.shopping_cart.war//org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:645)
at deployment.shopping_cart.war//org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:282)
at deployment.shopping_cart.war//org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:263)
at deployment.shopping_cart.war//org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:317)
at deployment.shopping_cart.war//org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:330)
at deployment.shopping_cart.war//org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:287)
at deployment.shopping_cart.war//org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:193)
at deployment.shopping_cart.war//org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:123)
at deployment.shopping_cart.war//org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:194)
at deployment.shopping_cart.war//org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38)
at deployment.shopping_cart.war//org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:179)
at deployment.shopping_cart.war//org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32)
at deployment.shopping_cart.war//org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:75)
at deployment.shopping_cart.war//org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:102)
at deployment.shopping_cart.war//org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:634)
at deployment.shopping_cart.war//org.hibernate.internal.SessionImpl.save(SessionImpl.java:627)
at deployment.shopping_cart.war//org.hibernate.internal.SessionImpl.save(SessionImpl.java:622)
at deployment.shopping_cart.war//controllers.UserCreate.doPost(UserCreate.java:51)
at javax.servlet.api@2.0.0.Final//javax.servlet.http.HttpServlet.service(HttpServlet.java:523)
at javax.servlet.api@2.0.0.Final//javax.servlet.http.HttpServlet.service(HttpServlet.java:590)
at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
at io.undertow.core@2.1.3.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)
at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132)
at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
at io.undertow.core@2.1.3.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.core@2.1.3.Final//io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
at io.undertow.core@2.1.3.Final//io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
at io.undertow.core@2.1.3.Final//io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
at io.undertow.core@2.1.3.Final//io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
at io.undertow.core@2.1.3.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
at io.undertow.core@2.1.3.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68)
at io.undertow.core@2.1.3.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:269)
at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:78)
at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:133)
at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:130)
at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
at org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)
at org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)
at org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)
at org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)
at org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)
at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:249)
at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:78)
at io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:99)
at io.undertow.core@2.1.3.Final//io.undertow.server.Connectors.executeRootHandler(Connectors.java:370)
at io.undertow.core@2.1.3.Final//io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)
at org.jboss.threads@2.3.3.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
at org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1982)
at org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
at org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: java.sql.SQLIntegrityConstraintViolationException: Column 'date_added' cannot be null
at deployment.shopping_cart.war//com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:117)
at deployment.shopping_cart.war//com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at deployment.shopping_cart.war//com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at deployment.shopping_cart.war//com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)
at deployment.shopping_cart.war//com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092)
at deployment.shopping_cart.war//com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040)
at deployment.shopping_cart.war//com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1347)
at deployment.shopping_cart.war//com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1025)
at deployment.shopping_cart.war//org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197)
... 67 more
答案 0 :(得分:3)
拥有字段时
@Column(name = "date_added", nullable = false, updatable=false, columnDefinition = "DATETIME DEFAULT CURRENT_TIMESTAMP")
@Temporal(value = TemporalType.TIMESTAMP)
private Date dateAdded;
未将dateAdded
设置为适当的值(因此将其保留为null
)会导致ConstraintViolationException
。因此,在初始化用户时,您需要设置dateAdded
,这通常是在构造函数中或通过JPA批注进行的,但您也可以手动进行设置:
[...]
user.getPerson().setDateAdded(new Date());
user.setUserGroup(userGroup); // Assign the new user this group
[...]
编辑:
因为我很懒,我想使事情自动化,所以我主要使用注释来自动更新日期。我特别不喜欢特定于供应商的解决方案,因此我通常使用JPA:
public class Person {
// ...
@PrePersist
public void prePersist() {
dateAdded = new Date();
}
}
尽管那里有针对Hibernate或Spring的更复杂的解决方案,但效果始终是相同的:使用基于注释的机制,您不再需要手动设置dateAdded
。