gpt4 book ai didi

java - 无法持久保存附加现有对象的新对象

转载 作者:行者123 更新时间:2023-12-01 12:32:43 24 4
gpt4 key购买 nike

我是一个新的 Hibernate 用户,我认为应该是一个非常简单的操作,这让我感到困惑。我正在尝试从数据库加载用户,将其附加到新对象,然后保留该新对象。我发现违反了空约束。

我的理解是,如果在数据库中找不到 AdmUser 对象,load() 方法会引发异常。为了确定,我查了一下,它绝对不为空。我知道它可能是代理,但我在同一个 session 中,所以这不应该是问题,对吧?我在这里做错了什么?

审核日志 POJO:

public class AdmAuditLog implements java.io.Serializable {

private AdmUser actionBy;
// ...

public AdmAuditLog() {
}

public AdmUser getActionBy() {
return this.actionBy;
}

public void setActionBy(final AdmUser actionBy) {
this.actionBy = actionBy;
}

// ...
}

AdmAuditLog.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.locustec.lotus.db.admin.AdmAuditLog" table="ADM_AUDIT_LOG">
<id ... />
<property ... />
<one-to-one name="actionBy" class="com.locustec.lotus.db.admin.AdmUser" fetch="join" lazy="false" />
</class>
</hibernate-mapping>

源代码:

final Session session = ...;
final Transaction transaction = session.beginTransaction();

final AdmUser user =
(AdmUser) asess.load(AdmUser.class, userId);
LOGGER.error("User {} = {}", user.getFullName(), user);

final AdmAuditLog adm = new AdmAuditLog();
adm.setXXX(xxx);
// more setters
adm.setActionBy(user);

session.save(adm);
transaction.commit();

日志文件:

20:04:47,900 ERROR User Eric Stein = com.mycompany.myproduct.db.admin.AdmUser@7b2792a0
20:04:49,578 WARN SQL Error: 515, SQLState: 23000
20:04:49,579 ERROR Cannot insert the value NULL into column 'ACTION_BY', table 'MyDatabase.dbo.ADM_AUDIT_LOG'; column does not allow nulls. INSERT fails.

审核日志 DDL:

USE [MyDatabase]
GO

/****** Object: Table [dbo].[ADM_AUDIT_LOG] Script Date: 09/12/2014 20:09:55 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[ADM_AUDIT_LOG](
[ALID] [int] NOT NULL,
[SCOPE_ID] [bigint] NOT NULL,
[SCOPE] [nvarchar](100) NOT NULL,
[ACTIVITY_ID] [bigint] NOT NULL,
[ACTIVITY] [nvarchar](100) NOT NULL,
[ELEMENT_ID] [bigint] NULL,
[ELEMENT] [nvarchar](200) NULL,
[DETAIL] [nvarchar](2000) NULL,
[ACTION_BY] [bigint] NOT NULL,
[ACTION_DATE] [datetime] NOT NULL,
[ACTION_FROM] [nvarchar](50) NULL,
CONSTRAINT [PK_ADM_AUDIT_LOG] PRIMARY KEY CLUSTERED
(
[ALID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

我想这就是全部了。如果还有其他有帮助的事情,请不要羞于询问。

最佳答案

一对一元素用于双向一对一关联的“反向”端。

一对一元素不映射到数据库外键。您需要使用独特的多对一来代替:

<many-to-one 
name="actionBy"
class="com.locustec.lotus.db.admin.AdmUser"
fetch="join"
lazy="false"
unique="true"
not-null="true"/>

多对一元素能够控制 FK,因此它将保留映射。

关于java - 无法持久保存附加现有对象的新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25816245/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com