使用没有Cascade Persist的JPA

时间:2015-08-11 15:59:22

标签: java hibernate jpa

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

我想将数据保存在我的数据库中,我不能使用Persist Cascade,因为我有许多重复的对象,我想识别重复的对象并将它们与持久的对象关联起来(Error和MainError的名称是唯一的)< / p>

Error error1 = new Error ("ERR1");
Error error2 = new Error ("ERR2");
Error error3 = new Error ("ERR3");
Error error4 = new Error ("ERR4");
Error error5 = new Error ("ERR5");
Error error6 = new Error ("ERR1");

MainError mainError1 = new MainError("MAIN1");
MainError mainError2 = new MainError("MAIN2");
MainError mainError3 = new MainError("MAIN2");

mainError1.addError(error1);
mainError1.addError(error2);
mainError1.addError(error3);
mainError1.addError(error6);
mainError2.addError(error1);
mainError2.addError(error4);
mainError3.addError(error5);

//persisting Error and MainError

例如,如果我已经在我的数据库中保持错误error1 = new Error(&#34; ERR1&#34;)然后我想保持错误error6 = new Error(&#34; ERR1&#34;);我希望我的应用程序能够认识到这已经存在并且关联了#ER; ERR1&#34;到相应的MainError。 我想我需要创建一个方法findByName来知道Error / MainError的名称是否已经存在,如果是,返回此对象,使用它并合并它?

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

1 个答案:

答案 0 :(得分:1)

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

替代解决方案:

在您的情况下,数据库设计应该是这样的:

错误:

id varchar (PK)

mainerror:

id varchar (PK)
error_id varchar (FK)

并且实体类应该是这样的:

<强> Error.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

}

<强> MainError.java

@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
}

你应该通过为main_error表制作id和error_id的联合PK来防止添加重复记录。