Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有办法将非基类型放入实体中?_Java_Spring_Hibernate_Jpa - Fatal编程技术网

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字段,当我试图覆盖它时,抛出异常。你能看一下这个问题吗?