Java 有没有办法将非基类型放入实体中?
我有这样一个实体:Java 有没有办法将非基类型放入实体中?,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我有这样一个实体: @Entity public Asset extends BaseEntity { private String name; private Localization currentLocalization; private Localization plannedLocalization; } 它抛出的基本属性类型不应为“持久性实体”。 我知道实体应该有Id等,但如果我不想仅仅为了本地化而创建另一个表、服务、存储库,那该怎么办呢?它应该只是一
@Entity
public Asset extends BaseEntity {
private String name;
private Localization currentLocalization;
private Localization plannedLocalization;
}
它抛出的基本属性类型不应为“持久性实体”。
我知道实体应该有Id等,但如果我不想仅仅为了本地化而创建另一个表、服务、存储库,那该怎么办呢?它应该只是一个属性,而不是另一个表
编辑:
本地化:
@Embeddable
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class Localization {
@OneToOne(targetEntity = Floor.class, fetch = FetchType.LAZY)
@JoinColumn(name = "FLOOR_ID")
private Floor floor;
@Min(0)
@Max(1000)
private int xAxis;
@Min(0)
@Max(2400)
private int yAxis;
@Min(0)
@Max(999)
private int zAxis;
}
在这里,我使用@Embedded
进行属性覆盖,如:
@Embedded
private Localization localization;
@Embedded
@AttributeOverrides({
@AttributeOverride(name="floor.id", column = @Column(name = "floor_plannedId"))
})
private Localization localizationPlanned;
但它抛出:
实体映射中的重复列:com.mrfisherman.relice.entity.Asset.Assetenty列:floor\u id(应使用insert=“false”update=“false”进行映射)
无论我如何在
@AttributeOverride
中设置名称,错误都是由于本地化
不是任何可直接映射到任何数据库列类型的“基本类型”。因此,它应该是一个实体和类型为Localization
的字段,映射为@OneToOne
或@ManyToOne
但您不需要另一个实体,因此另一个选项是使其可嵌入
假设您的本地化
如下:
@Getter @Setter
public class Localization {
private String str;
private Integer num;
}
通过如下注释,可以将本地化中的字段展平到包含的类:
@Embeddable
public class Localization { ...
并在您的资产中告诉您应该嵌入此字段:
@Embedded
private Localization currentLocalization;
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "str", column = @Column(name = "str2")),
@AttributeOverride(name = "num", column = @Column(name = "num2"))
})
private Localization plannedLocalization;
这将生成一个如下表:
Table "public.asset"
Column | Type | Collation | Nullable | Default
--------+------------------------+-----------+----------+---------
id | bigint | | not null |
num | integer | | |
str | character varying(255) | | |
name | character varying(255) | | |
num2 | integer | | |
str2 | character varying(255) | | |
正如你在表格中看到的,它现在变平了。您还可以看到,因为在您的资产中有两个本地化
,所以您需要处理冲突的列名
currentLocalization
可以使用默认命名,但是plannedLocalization
不能,因为currentLocalization
已经保留了这些列名。这就是为什么需要属性覆盖
考虑到所有这些,您可以再次评估是否创建另一个实体并使用@OneTOne
或@ManyToOne
映射。这取决于你的本地化的复杂程度。你应该使用或休眠“我不想为本地化创建另一个表、服务、存储库,它们应该只是一个属性,而不是另一个表”-因此,一个@embedded
?你能告诉我们BaseEntity
?@Aman-基本实体只包含ID,@crizzis-ye我以前试过,我在其他地方的代码中也使用过,但当我甚至使用attributesoverrides时,它显示floor_id不是唯一的(private floor floor是本地化字段之一)嗨,我试过了,我在其他地方也使用@Embeddeble,问题是我的本地化类有floor字段,当我试图覆盖它时,抛出异常。你能看一下这个问题吗?