2016-07-15 205 views
0

我的问题很简单..Hibernate | Spring Data JPA | @OneToOne

  1. 比方说,有2类..在图书和作者
  2. 让我们假设一本书只能由1个作者写的。
  3. 作者可以写很多书。
  4. 让我们假设作者有独特的名字。 [没有2位作者可以有同名]

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

从主要的方法 - 我救一个具有名称“BOOK1”和作者姓名“作者1”

书BOOK1如果我把级联所有..两本书和作者能够顺利通过省书保存。

问题

现在,如果我救另一个书同一作者 - 它节省了书,再创作。这意味着我结束了2个相同的作者。

我做了什么

  1. 我更换级联ALL用MERGE。
  2. 分配笔者前书 - 我检查DB的名字 -

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

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)分配给新客户。

我的问题是我上面做了什么,即搜索现有作者(或上述案例中的地址)是否正确? ..避免在作者(或地址表)重复的行

+1

欢迎阅读堆栈溢出,请阅读[**我如何问一个好问题?**](http://stackoverflow.com/help/how-to-ask)特别是**“Write一个总结特定问题的标题“**部分。 –

+0

添加将对象写入数据库的代码。我也怀疑这是你错过getter/setter和equals/hashCode实现的实际对象。 –

+0

添加到主帖 – reverse

回答

3

如果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>(); 

} 
+0

嗯..它不是那么简单..例如..客户和地址..客户可以有一个或多个地址..如果新客户是与其他客户共享地址..然后不要坚持地址..只需将地址(id)分配给新客户。 – reverse

+0

@reverse我更新 –

+0

谢谢,但我的问题是不同的。 ..映射不会自动保存重复..对吗?我们必须自己照顾..通过在数据库中首先查找..就像我在主要方法中所做的一样..复制粘贴上面..请注意,我的问题不是映射..它是关于避免在“映射”实体中出现重复。 – reverse