我正在创建一个数据库,保存有关其他数据库的信息,我想插入一个条目.课程如下所示:

@Entity
@Table(name = "table_info")
public class TableInfo {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @OneToOne
    @JoinColumn(name = "database_id")
    private DatabaseInfo databaseInfo;

    @Column(name = "table_name", length = 255, nullable = false)
    private String tableName;

    @Column(name = "created_at")
    private Timestamp createdAt;
    // Getter Setters, etc
}
@Entity(name = "UserInfo")
@Table(
        name = "UserInfo",
        uniqueConstraints = {
                @UniqueConstraint(name = "user_unique", columnNames = "username")
        }
)
public class UserInfo {

    @Id
    @SequenceGenerator(
            name = "userinfo_sequence",
            sequenceName = "userinfo_sequence",
            allocationSize = 1
    )
    @GeneratedValue(
            strategy = GenerationType.SEQUENCE,
            generator = "userinfo_sequence"
    )
    @Column(
            name = "id",
            updatable = false
    )
    private Long id;

    @Column(
            name = "masterID",
            updatable = true,
            nullable = false
    )
    private Long masterID;

    @Column(
            name = "username",
            updatable = false,
            nullable = false,
            columnDefinition = "TEXT"
    )
    private String username;

    @Column(
            name = "email",
            updatable = false,
            nullable = false,
            columnDefinition = "TEXT"
    )
    private String email;

    @Column(
            name = "password_hash",
            updatable = true,
            nullable = false,
            columnDefinition = "TEXT"
    )
    private String password_hash;
    // Getter Setters, etc

}

@Entity
@Table(name = "ownership_details")
public class OwnershipDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ownership_details_id")
    private Long id;

    @Column(name = "access_level")
    private Integer access_level;

    @OneToOne(
            cascade = CascadeType.MERGE,
            fetch = FetchType.LAZY,
            orphanRemoval = true
    )
    @JoinColumn(name = "user_id", referencedColumnName = "id")
    private UserInfo user;

    @OneToOne(
        cascade = CascadeType.MERGE,
        fetch = FetchType.LAZY,
        orphanRemoval = true
    )
    @JoinColumn(name = "table_id", referencedColumnName = "id")
    private TableInfo tableInfo;
}

以下是我的Ownership Detail存储库:

@Repository
public interface OwnershipDetailsRepository extends JpaRepository<OwnershipDetails, Long> {
    
}

每当我try 插入新的Ownership Detail对象时,我只需使用: ownershipDetailsRepository.save(ownershipDetails);

每当我这样做时,我都会收到一个错误: not-null property references a null or transient value : project.BackEnd.User.UserInfo.email个 这显然意味着它正在try 插入一个新的userInfo对象,而不是创建对已经存在的对象的引用.我的问题是,如何才能强制它创建引用,而不是try 在数据库中创建另一个实体.

推荐答案

实际上,它正试图插入一个新的userInfo对象,而不是创建对已存在对象的引用.

你必须首先通过使用getReferenceById、findById或任何其他finder方法获得对持久化UserInfo实体的引用,然后在保存之前在OwnershipDetails上设置UserInfo实体.

每当您try 插入新的Ownership Detail时,Spring data JPA都会检测到它是一个新实体,并调用em.Persistent. 在这种情况下不使用CascadeType.MERGE,因为它与父实体上的合并操作相关,而不是持久化. 所以Hibernate抱怨它试图持久化分离的UserInfo实例(而不try 持久化它,因为没有定义CascadeType.PERSIST).

var user = userInfoRepository.getReferenceById(userInfoId);
// build ownershipDetails
ownershipDetails.setUser(user);
ownershipDetailsRepository.save(ownershipDetails);

Java相关问答推荐

为什么Java中的两个日期有差异?

方法没有用正确的值填充数组—而是将数组保留为null,'

@org.springframework.beans.factory.annotation.Autowired(required=true)-注入点有以下注释:-SpringBoot

Java .类参数不通过构造函数传递

对运行在GraalVM-21上的JavaFX应用程序使用分代ZGC会警告不支持JVMCI,为什么?

Java Swing:初始化身份验证类后未检测到ATM_Interface键事件

如何从JNI方法正确调用NSOpenPanel以在正确的线程上运行?

Jenv-相同的Java版本,但带有前缀

将Spring Boot 3.2.0升级到3.2.1后查询执行错误

WebSockets和Spring Boot安全性出现错误401

在向WebSphere中的文档添加元素时iText挂起

我的Spring Boot测试显示&IlLegalStateException:无法加载某事的ApplicationContext.

是否在settings.xml中使用条件Maven镜像?

Java.lang.invke.LambdaConversionException:实例方法InvokeVirtual的参数数量不正确

垃圾回收器是否真的删除超出作用域的对象?

Java类型推断:为什么要编译它?

为什么Instant没有从UTC转换为PostgreSQL的时区?

升级版本后出现非法访问错误

为什么当我输入变量而不是直接输入字符串时,我的方法不起作用?

Xml Reader 将 BMP 外部的字符解析为代理项对,这会导致无效的 xml