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

@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相关问答推荐

空手道比赛条件

scanner 如何在执行hasNextLine一次后重新读取整个文件?

S的字符串表示是双重精确的吗?

现场观看Android Studio中的变化

如何在ApachePOI中将图像添加到工作表的页眉?

与不同顺序的组进行匹配,不重复组但分开

Javadoc在方法摘要中省略方法

try 在Android Studio中的infoWindow中使用EditText(Java)

Lombok@Nonnull是否也对供应商有影响?

找出承载Cargo 的最小成本

为什么创建Java动态代理需要接口参数

在Java Spring JPA中插入包含对其他实体的引用的列

在Spring Boot中使用咖啡因进行缓存-根据输出控制缓存

使用同步方法中的新线程调用同步方法

基于距离的APACHE POI公式判断

rest api服务 spring 启动中出现IllegalFormatConversionException

验证没有';t work on Hibernate Entity';s字段

OpenJDK20:JEP434:Foreign Function&;内存API(第二次预览)

Java方法参数:括号中的类型声明?

将Optionals/null安全添加到嵌套的flatMap/流