我有一个表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,
)
我认为你面临的问题不是在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
)。
@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响应的资源。它给出了以下例外: 我经历了几个类似的问题,发现自定义消息转换器可以解决这