java - Hibernate注解一对多关系映射的优化方式

标签 java mysql spring hibernate java-8

我正在开发一个 Spring MVC WEB 应用程序,我很难在我的实体类中使用 Hibernate 并使用正确的注释来应用“良好”的映射设计。我想就用 Java 表示数据库表的最佳设计获得一些建议。

为了了解我的情况: 此 ORM 映射的目标将用于在 SentMessage 表中保留现有的未编码 xml 文件。在 FeedBackMessage 表中,我将保留已解析为 Java 对象的现有 CSV 文件(反馈)。

基于这个“批处理”,我必须根据数据库级别收到的反馈进行比较,以了解哪个 documentid 收到了可能数量的状态。

我尝试过以下设计,但当我尝试在数据库中插入数据时出现“分离实体错误”:

SentMessage 实体

@Entity
@Table(name = "SENTMESSAGES")
public class SentMessaages{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "documentid")
    private String documentid;

    @Column(name = "documenttitle")
    private String documenttitle;

    @Column(name = "language")
    private String language;

    @Column(name = "email")
    private String email;

    /***************************************/
    Setters en Getters method
    //****//
}

反馈消息实体

@Entity
@Table(name = "FEEDBACKMESSAGES")
public class FeedbackMessage {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer Id;

    @Column(name = "documentid")
    private String documentid;

    @Column(name = "status")
    private String status;

    @Column(name = "returndate")
    private Date returndate;

    @Column(name = "action")
    private String action;

    @Column(name = "actiondate")
    private String actiondate;


        Other fields...
/***************************************/
    Setters en Getters method
    //****//
}

在 MYSQL 中为表创建语句

CREATE TABLE `sentmessages` (
  `documentid` varchar(45) DEFAULT '',
  `language` varchar(30) DEFAULT NULL,
  `sending_date` date DEFAULT NULL,
  `customtext07` varchar(45) DEFAULT NULL,
  `customtext12` varchar(45) DEFAULT NULL,
  `customerid` varchar(45) DEFAULT NULL,
  `email` varchar(100) DEFAULT NULL,
  `documenttitle` varchar(45) DEFAULT NULL,
  `count` int(11) DEFAULT NULL,
  PRIMARY KEY (`documentid`)
) ENGINE=InnoDB;



CREATE TABLE `feedbackmessages` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `documentid` varchar(45) DEFAULT NULL,
  `status` varchar(45) DEFAULT NULL,
  `endcustomerid` varchar(45) DEFAULT NULL,
  `reason` varchar(45) DEFAULT NULL,
  `actiondate` date DEFAULT NULL,
  `email` varchar(45) DEFAULT NULL,
  `batchid` varchar(150) DEFAULT NULL,
  `filename` varchar(45) DEFAULT NULL,
  `channel` varchar(45) DEFAULT NULL,
  `islegal` varchar(45) DEFAULT NULL,
  `action` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`),
  INDEX `FK_ID` (`document_id`),
  CONSTRAINT `FK_DOCID` FOREIGN KEY (`document_id`) REFERENCES `sentmessages` (`documentid`)

) ENGINE=InnoDB;

最佳答案

我相信您想要一个父(sentmessage)/子(feedbackmessages)关系映射?如果是这样,映射如下(在子类中):

@ManyToOne
  @JoinColumn(name="documentid",
    referencedColumnName = "documentid"
  private SentMessage sentMessage;

本文可能会帮助您处理一般的 Hibernate 实体映射:http://www.objectdb.com/java/jpa/entity

关于java - Hibernate注解一对多关系映射的优化方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42928177/

相关文章:

java - 将数组数据输入到与另一个类中的另一个方法不同的类中的方法中

java - Java中如何一次停止多个线程中的每个线程?

java - 如何将bean属性设置为另一个bean的属性

mysql - 连接到 kubernetes mysql 服务时 go-mysql 连接被拒绝

java - simpMessagingTemplate convertAndSendToUser 大量等待线程阻塞其他功能

java - Spring AOP配置拦截所有异常

java - org.springframework.web.bind.MissingServletRequestParameterException : Required Date parameter 'startTime' is not present

java - 在 Java 中将值附加到列表的元素

php - MySQL 中的算术运算

mysql - PHP SQL 内部连接或联合