Java 映射具有可能不存在的属性的对象
假设我有两个类,分别名为TextList和ArticleJava 映射具有可能不存在的属性的对象,java,hibernate,Java,Hibernate,假设我有两个类,分别名为TextList和Article public class Article() { public int a_id; public TextList text; } public class TextList(){ private String text1; private String text2; private String text3; private String text4; } 还有一个类似于以下文本的表格
public class Article() {
public int a_id;
public TextList text;
}
public class TextList(){
private String text1;
private String text2;
private String text3;
private String text4;
}
还有一个类似于以下文本的表格:
text_id text_type text_content article_Id
1 text1 "Oh no" 1
2 text3 "He has a dog" 1
3 text4 "A Labrador" 1
正如您所见,对于article_uid1,我有三个文本(text1、text3、text4)。本文没有文本类型2,这也不是问题。问题是,如何正确映射类TextList中的字符串,即检查text\u type列并映射到它所属的属性?另外,如何映射表中可能存在或可能不存在的属性?根据您显示的表布局,您可以按如下方式建模,基本上模拟您描述的表
@Entity
public class TextEntity {
@Id
@Column(name = "text_id")
private Long id;
@Enumerated
@Column(name = "text_type")
private TextType textType;
@Column(name = "text_content")
private string text;
@ManyToOne
@JoinColumn(name = "article_id", referencedColumnName = "article_id")
private Article article;
}
public enum TextType {
TEXT1,
TEXT2,
TEXT3,
TEXT4
}
但是,如果表模式没有被锁定,您可以使用稍微不同的替代方案,我可能建议使用标识映射的@ElementCollection
来完成相同的任务
@Entity
public class Article {
@Id
@Column(name = "article_id")
private Long id;
@ElementCollection
private Map<String, String> textMap;
}
Map
键将是文本类型,而值将是实际文本内容。Hibernate会自动为您维护文章id关系。谢谢您的回答,但是没有办法使用相同的模型(意味着没有枚举)和相同的数据库吗?我正在尝试将一个工作程序切换到Hibernate,因此我不希望更改表的模型。TextEntity
不要求您使用枚举。您可以轻松地将其替换为字符串
,并按原样使用它,这将为您提供完全相同的表结构。我倾向于使用Enum将特定的有限数据限制在期望值内,因为字符串
最终可以是“任何东西”。您好,我已经尝试了您的建议,但仍然有一个新问题。问题是这个表用于多个实体,比如当“text_type”=“info”(只是一个示例)时,文本不再属于类文章,而是属于其他内容。在这种情况下有什么建议吗?长话短说,我想检查column的值,以确定此行属于哪个类的哪个属性。这可能吗?请提前通知我。!这是与文章
相关的“其他东西”,还是该表基本上包含与使用各种FK关系列的各种其他表关联的文本?
+-------------+----------------+------------+
| textMap_key | textMap_value | article_id |
+-------------+----------------+------------+
| text1 | "Oh no" | 1 |
| text3 | "He has a dog" | 1 |
| text4 | "A labrador" | 1 |
+-------------+----------------+------------+