当前位置: 首页 > 知识库问答 >
问题:

列上的许多选项不是唯一的

暴阳州
2023-03-14

我有一个表Message,我在其中保存传入和传出的消息。保留一列“类别”来区分,它可以有1=INCOMING,2=OUTGOING。传出的消息可以有附件。以下是我的消息实体类:

@Entity("MESSAGE")
class Message{
  Long id; //primary key
  String additionalStringId;
  private Long senderId;
  private Long receiverId;
  Category messageCategory;
  @OneToMany(
            mappedBy = "message",
            cascade = CascadeType.ALL,
            orphanRemoval = true)
  private List<AttachmentEntity> outgoingAttachments= new ArrayList<>();
}

问题是AttachmentEntity通过“additionalStringId”与消息链接,我不能影响数据库模式。

class AttachmentEntity{
  @ManyToOne
  @JoinColumn(name = "additionalStringId", referencedColumnName = "additionalStringId")
  private Message message;
}

我知道截取代码不起作用,但当发送方=接收方时,当我试图向自己发送消息时,我的问题就会出现。在这种情况下,在我的数据库中,我将有两条消息,具有相同的additionalStringId,但类别=1,另一条具有类别=2。我的附件实体列表试图链接到消息,但有两条消息可见。我能做些什么来解决这个问题?

我尝试用@在哪里和@判别公式和@判别值将这两个类别分成不同的实体,但我无法让它工作。我能做什么?

表DDL:

CREATE TABLE "MESSAGE" 
   (    "ID" NUMBER NOT NULL ENABLE, 
    "MESSAGE_ID" VARCHAR2(60) NOT NULL ENABLE,  
    "CATEGORY" NUMBER, 
    "SENDER_ID" NUMBER, 
    "RECEIVER_ID" NUMBER    ) 
CREATE TABLE "OUTBOX_ATTACHMENT" 
   (    "ID" NUMBER NOT NULL ENABLE, 
    "MESSAGE_ID" VARCHAR2(60) NOT NULL ENABLE, 
    )

共有2个答案

薛弘阔
2023-03-14

我认为你面临的问题不是在JPA级别,而是在表定义级别(DDL)。

CREATE TABLE "MESSAGE" 
   (    "ID" NUMBER NOT NULL, 
    "MESSAGE_ID" VARCHAR2(60) NOT NULL,  
    "CATEGORY" NUMBER, 
    "SENDER_ID" NUMBER, 
    "RECEIVER_ID" NUMBER,
    constraint uq1 unique (category, message_id)
   );

CREATE TABLE "OUTBOX_ATTACHMENT" 
   (    "ID" NUMBER NOT NULL , 
    category number not null constraint chk1 check (category = 2),
    "MESSAGE_ID" VARCHAR2(60) NOT NULL ,
    constraint fk1 foreign key (category, message_id) 
      references message (category, message_id)
   );

如您所见,FK包括两列:类别message_id。但是,根据要求,在附件表类别中,只能接受对传出消息的附件(值2)。

何楷
2023-03-14
@ManyToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = "additionalStringId", referencedColumnName = "id", nullable = false)
private Message message;


@OneToMany(mappedBy = "message", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<AttachmentEntity> outgoingAttachments = new ArrayList<>();

像这样的东西可能有用。

 类似资料:
  • 问题内容: 下面是我的代码,我只想显示我在sqlite数据库中插入的数据到文本视图,但是我遇到这个错误,说id不是唯一的。 这是我的整个Java代码。谢谢 :) 问题答案: 好吧,我认为这个项目在您首次运行时效果很好。当您第二次运行它时,由于是您的ID为1的行已被插入到您的数据库中,因此会出现错误。 要消除错误,请执行以下任一操作:

  • 问题内容: 我正在将SEAM 2 / Hibernate与PostgreSQL 9数据库一起使用。我有下表 我想添加一个约束,以确保每个新条目都具有active_band_user和active_band_date的唯一组合。 每秒可能有许多次尝试插入,因此我需要尽可能地提高效率,是否可以在实体映射中使用SEAM /hibernate注释? 提前致谢 问题答案: 没有Hibernate注释在插入/

  • 问题内容: 以下代码适用于,它是否也返回重复的笛卡尔积,如果是,如何获得唯一的笛卡尔积? 当我传递包含列表的列表时,这似乎也不起作用 问题答案: 要仅获取唯一元素,可以使用这样的set表示法( 注意: 这不能保证顺序) 或根据Paul Draper的评论,我们可以像这样 如果您也想维护订单 要使您的程序可以使用列表列表,只需将函数声明从 至

  • 问题内容: 我试图创建一个表,我需要它不允许3个字段相同的行。 当我使用SQLLite在Python中创建表时,使用了以下代码,但几乎没有得到任何结果。它通常在写入2条记录后停止,因此显然可以相信它是重复的。 因此,我希望数据库不允许在ownerID1,ownerID2,accountKey和argID1相同的记录。 谁能帮我这个忙吗? 谢谢! 问题答案: 我不确定是什么问题。它在这里工作正常:

  • 问题内容: 给定Postgres数据库中的以下三列:第一,第二,第三;我如何创建一个约束使得排列是唯一的? 例如,如果数据库中存在,则将其作为非唯一变量排除在外。 问题答案: 您可以使用hstore创建唯一索引: 更新 实际上

  • Spring boot应用程序,其中我有一个通用类ApiCaller来调用不同的URL。我正在使用RestTemplate打电话。打电话的细节来自我们的内部数据库。 可以看出,我将响应类型作为Map.class发送,它将响应从api转换为map。它可以很好地处理返回json响应的api。但是,它不适用于返回xml响应的资源。它给出了以下例外: 我经历了几个类似的问题,发现自定义消息转换器可以解决这