Java 如何使用hibernate保存多人关系

Java 如何使用hibernate保存多人关系,java,hibernate,Java,Hibernate,我有以下用户实体 @Id @GeneratedValue(策略=GenerationType.IDENTITY) @列(name=“user\u id”) 私有int-id; @嵌入 私人; @列(columnDefinition=“VARCHAR(255)”) 私有字符串图像; @manytone(fetch=FetchType.LAZY) @JoinColumn(name=“user\u group\u id”) 私有用户组用户组; //一些能手和二传手被选中了 公共int getId(){

我有以下
用户
实体

@Id
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“user\u id”)
私有int-id;
@嵌入
私人;
@列(columnDefinition=“VARCHAR(255)”)
私有字符串图像;
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“user\u group\u id”)
私有用户组用户组;
//一些能手和二传手被选中了
公共int getId(){
返回id;
}
公共无效集合id(内部id){
this.id=id;
}
公共用户组getUserGroup(){
返回用户组;
}
public void setUserGroup(UserGroup UserGroup){
this.userGroup=userGroup;
}
以及以下可嵌入的
Person
实体

@NotNull
@列(name=“firstname”,nullable=false,columnDefinition=“VARCHAR(32)”)
私有字符串名;
@NotNull
@列(name=“lastname”,nullable=false,columnDefinition=“VARCHAR(32)”)
私有字符串lastName;
@NotNull
@列(nullable=false,columnDefinition=“VARCHAR(96)”)
私人字符串电子邮件;
@NotNull
@列(nullable=false,columnDefinition=“VARCHAR(24)”)
专用串电话;
@NotNull
@列(nullable=false,columnDefinition=“VARCHAR(255)”)
私有字符串密码;
@列(nullable=false,columnDefinition=“TINYINT(1)默认值1”)
私有布尔状态;
@列(name=“date\u added”,nullable=false,updateable=false,columnDefinition=“DATETIME DEFAULT CURRENT\u TIMESTAMP”)
@时态(值=TemporalType.TIMESTAMP)
已添加私人日期;
以及以下
用户组
实体

@Id
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“user\u group\u id”)
私有int-id;
@NotNull
@列(nullable=false,columnDefinition=“VARCHAR(20)”)
私有字符串名称;
@NotNull
@列(nullable=false,columnDefinition=“TEXT”)
私有字符串权限;
@OneToMany(mappedBy=“userGroup”,
cascade={CascadeType.PERSIST,CascadeType.MERGE},
fetch=FetchType.LAZY)
private List users=new ArrayList();
//接应者和接应者
我已经在数据库中设置了几个用户组。添加新用户时,我检索一个特定组,并希望将其分配给新用户。我使用以下代码来实现这一点

会话会话=HibernateHelper.getSessionFactory().openSession(); UserGroup UserGroup=(UserGroup)session.createQuery(“来自UserGroup UG,其中UG.id=:user\u group\u id”) .setParameter(“用户组id”,整数.parseInt(组)) .getSingleResult(); 事务tx=session.getTransaction(); tx.begin(); 用户=新用户(); user.setPerson(newPerson()); user.getPerson().setFirstName(firstName); user.getPerson().setLastName(lastName); user.getPerson().setEmail(电子邮件); user.getPerson().setTelephone(电话); user.getPerson().setPassword(hashedPassword); user.setUserGroup(userGroup);//将新用户分配到此组 session.save(用户); 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

当你在球场上

@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

当您有字段时

@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还有更复杂的解决方案,但效果总是一样的:使用基于注释的机制,您不需要再手动设置
添加日期

请与错误共享完整的堆栈跟踪。@JorgeCampos现在提供了错误堆栈跟踪。
date\u added
不是null字段是数据库,您正在尝试为此保存null或不发送value@Rono我的可嵌入Person实体中有这样一个:@Column(name=“date\u added”,nullable=false,updateable=false,columnDefinition=“DATETIME DEFAULT CURRENT\u TIMESTAMP”)@Temporal(value=TemporalType.TIMESTAMP)private date date added;此列被设置为具有数据库中当前时间戳的默认值。时间更新配置在数据库中,但Jpa将其设置为null,您可以在该字段上使用
@CreatedDate
。请在此处与错误共享完整的堆栈跟踪。@JorgeCampos现在提供了错误堆栈跟踪