【问题标题】:How to create the table without @Id field in spring using jpa?如何使用jpa在spring中创建没有@Id字段的表?
【发布时间】:2018-11-16 05:11:52
【问题描述】:

我正在使用 spring boot 和 jpa 创建表,但我需要创建没有 @Id 主键列的表。没有这个 @Id 字段我无法创建表。如何使用 spring data jpa 得到这个?

LetterDoc.java

package com.ashwin.springsecurityangular.model;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import com.fasterxml.jackson.annotation.JsonIgnore;

@Entity
@Table(name = "letter_doc")
public class LetterDoc implements Serializable {

    private static final long serialVersionUID = 1L;

    @ManyToOne(fetch = FetchType.EAGER, optional = false,cascade=CascadeType.PERSIST)
    @JoinColumn(name = "letterNo")
    @JsonIgnore
    private Letter letter;

    @ManyToOne(fetch = FetchType.EAGER, optional = false,cascade=CascadeType.PERSIST)
    @JoinColumn(name = "documentId")
    @JsonIgnore
    private Document document;

    private String docFile;

//i omitted getters and setters and both constructor
}

它问我@Id 字段需要。所以出现如下错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: No identifier specified for entity: com.ashwin.springsecurityangular.model.LetterDoc

在这张表中,我避免使用@Id 字段,但它没有给我。如何实现这一点?

【问题讨论】:

标签: java spring hibernate spring-boot jpa


【解决方案1】:

JPA 规范清楚地叙述了实体类必须具有唯一的、不可变的 ID。但是,您可以尝试一些技巧。

1) 为此目的维护 UUID。

@Id
@Column(columnDefinition = "BINARY(16)")
private UUID uuid;

2) 在视图层创建数据字段的 DTO/POJO 表示,然后执行 SQL Native 查询,然后将结果集映射到您的类

【讨论】:

  • 它正在创建 uuid 列,或者你可以建议我将它们都变成主键
  • 是的,表中会有一个名为 uuid 的列,并且将使用该列。
  • 我不需要这个 uuid 列 .. 如果不添加额外的列,我不能将这两个字段设为主键吗?
  • 您可以在这里使用约束,例如 @Table(uniqueConstraints= @UniqueConstraint(columnNames = {"letterNo", "documentId"}) 但这不能替换主键。所以要回答你的问题这里仍然需要PK
  • 如果这些列是唯一的,那么他不是在寻找不需要 UUID 的复合 id 吗?
【解决方案2】:

使用 JPA 投影 在您的情况下,您没有主键,因此请使用 JpaProjections 获取所需的字段 首先将Entity声明为

@Entity
@Immutable

设置您的存储库

public interface AddressView {
    String getZipCode();
}

然后在存储库界面中使用它:

public interface AddressRepository extends Repository<Address, Long> {
      @Query("SELECT ADDRESS from TABLE WHERE address =  ?1")
    AddressView getAddressByState(String state);
}

注意上面的 ADDRESS 实体是一个占位符 做吧

Public class ADDRESS{
@Id
Long id;

【讨论】:

    猜你喜欢
    • 2021-10-03
    • 1970-01-01
    • 2019-07-08
    • 2015-11-14
    • 2019-05-23
    • 2021-10-17
    • 1970-01-01
    • 2018-07-24
    • 2021-10-08
    相关资源
    最近更新 更多