Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用没有级联的JPA_Java_Hibernate_Jpa - Fatal编程技术网

Java 使用没有级联的JPA

Java 使用没有级联的JPA,java,hibernate,jpa,Java,Hibernate,Jpa,我有两个类Error和MainError(*-*与MainError的关联是关联的所有者) 我想在数据库中持久化数据,但无法使用持久化级联,因为我有许多重复对象,我想识别重复对象并将其与持久化对象关联(Error和MainError的名称是唯一的) 例如,如果我已经在数据库中保留了error1=newerror(“ERR1”),那么我想保留error6=newerror(“ERR1”);我希望我的应用程序能够识别这一点,并将“ERR1”与相应的MainError关联起来。 我想我需要创建一个fi

我有两个类Error和MainError(*-*与MainError的关联是关联的所有者)

我想在数据库中持久化数据,但无法使用持久化级联,因为我有许多重复对象,我想识别重复对象并将其与持久化对象关联(Error和MainError的名称是唯一的)

例如,如果我已经在数据库中保留了error1=newerror(“ERR1”),那么我想保留error6=newerror(“ERR1”);我希望我的应用程序能够识别这一点,并将“ERR1”与相应的MainError关联起来。 我想我需要创建一个findByName方法来知道Error/MainError的名称是否已经被持久化,如果是,返回这个对象,处理它并合并它

我希望我的问题不会令人困惑
非常感谢

正如您在问题中提到的,您可以手动检查数据库中是否存在数据?为此,还可以将该列设置为uniq约束

替代解决方案:

在您的情况下,数据库设计应如下所示:

错误:

id varchar (PK)
id varchar (PK)
error_id varchar (FK)
main错误:

id varchar (PK)
id varchar (PK)
error_id varchar (FK)
实体类应该是这样的:

错误。java

@Entity
public class Error {

    @Id
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 2147483647)
    @Column(nullable = false, length = 2147483647)
    private String id;

    @OneToMany(mappedBy = "errorId", fetch = FetchType.LAZY)
    private Collection<MainError> mainErrorCollection;

    public Error() {
    }

    public Error(String id) {
        this.id = id;
    }

    //getter and setter methods

}
@Entity
@Table(name = "main_error")
public class MainError {

    @Id
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 2147483647)
    @Column(nullable = false, length = 2147483647)
    private String id;

    @JoinColumn(name = "error_id", referencedColumnName = "id")
    @ManyToOne(fetch = FetchType.LAZY)
    private Error errorId;

    public MainError() {
    }

    public MainError(String id) {
        this.id = id;
    }

    //getter and setter methods
}

您应该通过对主错误表的id和错误id进行联合PK来防止添加重复记录。

谢谢您的回答,但我还不了解您的解决方案,JoinColumn的目的是什么?(当我指定OneToMany(mappedBy..)时,已经对FK进行了约束)对吗?我只是想告诉你,你可以在每个persist方法之前手动检查,比如
findByName
,或者让数据库处理重复记录,方法是将该列作为
主键或
uniq键
。答案中的Java类只是为了演示结构。你可以根据自己的要求更改它uirement..也可参考