我的问题很简单..


假设有2个课程..书和作者
假设一本书只能由一位作者撰写。
作者可以写很多书。
假设作者具有唯一的名称。 [没有两个作者可以使用相同的名字]


现在..假设所有的hibernate \ JPA配置都已完成。

从主要方法-我保存名称为“ book1”和作者名为“ author1”的Book book1

如果我将层叠设置为ALL ..则在保存书时会同时保存书和作者。

问题

现在,如果我与同一位作者保存另一本书-它会同时保存这本书和作者。这意味着我最终将有2位相同的作者。

我做了什么


我用MERGE替换了层叠ALL。
在指派作者参加图书之前-我正在检查数据库的名称-


一种。如果得到回应-我将检索到的作者分配给该书并保存该书。

b。如果没有任何结果-我将作者分配给这本书,然后保存作者和这本书。

这样我就能解决我的问题。

但这是正确的方法吗?

@Entity
class Book{

    @Id
    private Long bookId;

    private String name;

    @OneToOne
    private Author author;

}

@Entity
class Author{

    @Id
    private Long authorId;
    private String name;

}




主要代号

public static void main(String[] args) {
    ApplicationContext context = SpringApplication.run(BeanConfiguration.class, args);
    BookRepository bookRepo = context.getBean(BookRepository.class);
    AuthorRepository authorRepo = context.getBean(AuthorRepository.class);

    Book b1 = new Book();
    b1.setBookName("book1");

    Author a1 = new Author();
    a1.setAuthorName("author1");

    Author authorFromDatabase = authorRepo.findByAuthorName(a1.getAuthorName());
    if (authorFromDatabase == null) {
        b1.setAuthor(a1);
        authorRepo.save(a1);
    } else {
        b1.setAuthor(authorFromDatabase);
    }
    bookRepo.save(b1);
}


更新资料
这不是那么简单..例如..请考虑..客户和地址之间的关联..客户可以有一个或多个地址..如果一个新客户正在与其他客户共享地址..使持久地址..只需将地址(id)分配给新客户。

我的问题是我在上面做了什么,即寻找现有作者(或上述情况的地址)是正确的方法? ..避免在“作者”(或“地址”表)中重复行

最佳答案

如果Author可以有许多Book,则不是@OneToOne关联,而是@OneToMany关联。

@Entity
class Book{

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @ManyToOne(fetch = FetchType.LAZY)
    private Author author;

}

@Entity
class Author{

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @OneToMany(mappedBy = "author")
    private List<Book> books = new ArrayList<Book>();

}


将书籍添加到Author的最简单方法

Author author = new Author();
save(author);

Book book = new Book();
book.setAuthor(author);
save(book);

Book goodBook = new Book();
goodBook.setAuthor(author);
save(goodBook);


Book不是参考值(我的意思是目录,参考表),因此我们可以通过Book部分上的外键使用关联。

如果需要使用诸如CustomerAddress的引用值(引用),则应使用联接表。

@Entity
class Address {

    @Id
    @GeneratedValue
    private Long id;

}

@Entity
class Customer{

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @OneToMany
    private List<Address> addresses = new ArrayList<Address>();

}

关于java - hibernate | Spring 数据JPA | @OneToOne,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38389882/

10-09 05:38
查看更多