java - JPA:@ManyToOne,1 表中不必要的重复条目

标签 java mysql spring jpa

我有一个经销商搜索,其中保留了经销商。经销商的街道、姓名、电话号码等数据将通过 excel 文件以某种方式导入。

在我的数据库中,我需要有关经销商数据导入的元数据。

我使用 spring-boot-starter-jpa

我的模型:

导入(导入 [-process] 本身的元数据)

  • 日期时间
  • 状态(成功/失败)
  • 导入的经销商数量
  • 租户(哪个品牌/国家/地区的经销商,例如美国的大众汽车)
  • 环境(什么服务器:生产、测试​​、开发)

租户

  • 品牌(奥迪、大众、西雅特)
  • 市场(分销商所在的国家/地区)

导入和租户连接。每个导入包括一个租户。一个租户 Id 在 Import 表中多次出现。由品牌和市场/国家/地区组成的租户表中的每个租户都应该是唯一的。

数据行示例,应该如何:

导入

id - datetime - environment - numberOfDealers - status - tenant_id

  1. 2016-04-17 - 开发 - 122 - 成功 - 1
  2. 2016-04-17 - 开发 - 40 - 成功 - 2
  3. 2016-04-19 - 开发 - 130 - 失败 - 1
  4. 2016-04-22 - 上线 - 1044 - 成功 - 3

租户

tenant_id - 品牌 - 市场

  1. 韩语
  2. A - ARG
  3. A - 美国

实际情况如何:

租户

tenant_id - 品牌 - 市场

  1. 韩语
  2. A - ARG
  3. 韩语
  4. A - 美国

关系是正确的,但是Tenant有重复,输入了两次KOR

我的 Java 模型

@Entity
public class Import {

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

private String datetime;

private String status;

private Integer numberOfDealers;

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "tenant_id")
private Tenant tenant;

private String environment;

public Import() { }

public Import(String datetime, String status, Integer numberOfDealers, Tenant tenant, String environment) {
    this.datetime = datetime;
    this.status = status;
    this.numberOfDealers = numberOfDealers;
    this.tenant = tenant;
    this.environment = environment;
}

/*getters and setters here*/

}

package com.dasburo.model;

import com.fasterxml.jackson.annotation.JsonProperty;

import javax.persistence.*;
import java.util.List;

@Entity
//@Table(uniqueConstraints = {@UniqueConstraint(columnNames = {"market", "brand"})})
public class Tenant {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "tenant_id")
private Long tenantId;

private String market;

private String brand;

public Tenant() { }

public Tenant(String market, String brand) {
    this.market = market;
    this.brand = brand;
} 

/*getters and setters here*/

}

for (Import anImport : imports) {
    importDao.save(anImport);
}

imports 是一组 Import 对象,其中填充了数据,包括租户

使用 uniqueConstraints 注释只会设置表“Tenant”的结构,但不会设置行为。 JPA 仍然尝试在“租户”表中进行重复条目。

最佳答案

好吧,首先,如果您正在加载一个已经存在的模式并基于现有表创建实体,那么当重复发生时,您的模式中存在的唯一约束应该会导致异常。但是,如果您从实体创建表,那么您不能完全依赖注释来强制执行唯一约束,如 JPA wikibooks 中所述:

Some expect the JPA provider to have magic that automatically maintains relationships. This was actually part of the EJB CMP 2 specification. However the issue is if the objects are detached or serialized to another VM, or new objects are related before being managed, or the object model is used outside the scope of JPA, then the magic is gone, and the application is left figuring things out, so in general it may be better to add the code to the object model. However some JPA providers do have support for automatically maintaining relationships.

关于java - JPA:@ManyToOne,1 表中不必要的重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37214944/

相关文章:

spring - java.lang.IllegalArgumentException: error at::0 切入点中的正式未绑定(bind)

java - Hibernate逆向工程,在Spring MVC项目中使用

java - 不包含重复字符的最长公共(public)子串的长度

java - Apache Spark 性能

java - 如果 Wicket 链接到 CSS 样式表,为什么它会使页面有状态?

mysql - 如何为 MySql 生成正确的连接字符串

php - 获取每条记录中所有行的总和

mysql - 无法在无序表中使用限制和偏移量获取中间行

java - slf4j/logback/jcl-over-slf4j - 即使 jcl-over-slf4j 不在依赖项中,仍然路由到 logback?

java - 如何在 Android 中由 ScheduledExecutorService 生成的两个线程之间传递数据?