【问题标题】:Hibernate auto mapping of named entities命名实体的休眠自动映射
【发布时间】:2018-01-16 15:55:44
【问题描述】:

在我当前的 Spring Boot REST 示例项目中,我有两个实体(BookBookSummary)均由 PagingAndSortingRepository 提供。 Book 实体如下所示:

@Entity(name = "Book")
public class Book
{
    @Id
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
    private UUID uuid;

    private String title;

    private String author;

    private String publisher;

    @Transient
    private String type = "Book";

    ...[Getter & Setter]...
}

BookSummary 实体如下所示:

@Entity(name = "Book")
public class BookSummary
{
    @Id
    @GeneratedValue(generator = "UUID")
    @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
    private UUID uuid;

    private String title;

    private String author;

    @Transient
    private String type = "BookSummary";

    ...[Getter & Setter]...
}

PagingAndSortingRepository 实体如下所示:

@Repository
public interface BookRepository extends PagingAndSortingRepository<Book, UUID>
{
    Page<Book> findAll(Pageable pageable);
}

BooksRestController 实体如下所示:

@RestController
@RequestMapping("/books")
public class BooksRestController
{
    @GetMapping("/{uuid}")
    public Book read(@PathVariable UUID uuid)
    {
        return bookRepository.findOne(uuid);
    }

    @GetMapping
    public Page<Book> read(Pageable pageable)
    {
        return bookRepository.findAll(pageable);
    }

    @Autowired
    private BookRepository bookRepository;
}

关于PagingAndSortingRepositoryBooksController 实现,我假设REST 服务将通过/books 路由提供Book 实体的集合。但是该路由提供了BookSummary 实体的集合:

{
    content: [
        {
            uuid: "41fb943e-fad4-11e7-8c3f-9a214cf093ae",
            title: "Some Title",
            author: "Some Guy",
            type: "BookSummary"
        },
        ...
    ]
}

books/41fb943e-fad4-11e7-8c3f-9a214cf093ae 路由却提供了Book 摘要(如预期的那样):

{
    uuid: "41fb943e-fad4-11e7-8c3f-9a214cf093ae",
    title: "Some Title",
    author: "Some Guy",
    publisher: "stackoverflow.com"
    type: "Book"
}

有人可以帮助我理解 Hibernate 的以下行为吗?

【问题讨论】:

    标签: hibernate jpa spring-boot spring-data-jpa


    【解决方案1】:

    我猜 Hibernate 会感到困惑,因为您通过使用以下注释来命名两个具有相同实体名称的实体类:

    @Entity(name = "Book")
    

    在这种情况下,您应该简单地使用 @Entity 并让 Hibernate 使用实体类的非限定名称。

    为每个实体创建一个存储库也是一种好习惯:一个用于Book 实体,第二个用于BookSummary 实体。我不得不说,我从未见过用于两个不同实体的 Spring Data 存储库。无论如何,您的控制器逻辑可能如下:

    @RestController
    @RequestMapping("/books")
    public class BooksRestController
    {
        private final BookRepository bookRepository;
        private final BookSummaryRepository bookSummaryRepository;
    
        @Autowired
        public BooksRestController(BookRepository bookRepository, BookSummaryRepository bookSummaryRepository)
        {
            this.bookRepository = bookRepository;
            this.bookSummaryRepository = bookSummaryRepository;
        }
    
        @GetMapping("/{uuid}")
        public BookSummary read(@PathVariable UUID uuid)
        {
            return bookSummaryRepository.findOne(uuid);
        }
    
        @GetMapping
        public Page<Book> read(Pageable pageable)
        {
            return bookRepository.findAll(pageable);
        }
    }
    

    【讨论】:

    • 非常感谢您的快速回复。我认为我在这里错过了一些配置,因为休眠行为涵盖了一个非常常见的用例,通过使用 reduced 实体进行集合和 complex 实体进行详细响应。我考虑了您的建议并删除了名为@Enity 的注释并添加了@Table(name = "books")。两个实体都有自己的Repository
    猜你喜欢
    • 2014-11-19
    • 1970-01-01
    • 2019-12-03
    • 2020-12-18
    • 2016-10-18
    • 1970-01-01
    • 2021-11-11
    • 2015-10-31
    • 1970-01-01
    相关资源
    最近更新 更多