Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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 Hibernate模型OneToOne不共享整个对象?_Java_Spring_Hibernate_Architecture_Model - Fatal编程技术网

Java Hibernate模型OneToOne不共享整个对象?

Java Hibernate模型OneToOne不共享整个对象?,java,spring,hibernate,architecture,model,Java,Spring,Hibernate,Architecture,Model,我发现了Jpa和Hibernate,我对存储库和模型(使用spring)有一个问题 我有一个带有一些字段(例如id和type)的对象“Structure”,还有许多其他与结构相关的对象:例如address。 我希望在AddressRepository中获得如下地址: Address findByStructureId(long structureId); 但我发现的唯一方法是在对象地址中也有一个对象结构。根据内存,我不知道这是否是一个问题,因为结构是一个大对象,有很多子对象,比如地址 结构上

我发现了Jpa和Hibernate,我对存储库和模型(使用spring)有一个问题

我有一个带有一些字段(例如id和type)的对象“Structure”,还有许多其他与结构相关的对象:例如address。 我希望在AddressRepository中获得如下地址:

 Address findByStructureId(long structureId);
但我发现的唯一方法是在对象地址中也有一个对象结构。根据内存,我不知道这是否是一个问题,因为结构是一个大对象,有很多子对象,比如地址

结构上

@OneToOne(fetch = FetchType.LAZY, mappedBy = "structure", cascade = CascadeType.ALL)
private Address address;
住址

@GenericGenerator(name = "generator", strategy = "foreign", parameters = @Parameter(name = "property", value = "structure"))
@Id
@GeneratedValue(generator = "generator")
private long structureId;

@OneToOne(fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn
@JsonIgnore
private Structure structure;
我还有一个建筑方面的问题。 我需要每年保留结构的所有“子对象”,但我不知道如何做。
例如,我想要2012年结构1的地址。

我将尝试回答,我看到了几种改进代码的方法

根据记忆,我不知道这是否是个问题,因为 结构是一个大对象,有很多子对象,比如地址

由于延迟加载,这不是问题。如果加载address对象,但从不调用getStructure方法(或内部调用structure对象),则不会从DB加载structure对象

现在,使用您的address类:

@GenericGenerator(name = "generator", strategy = "foreign", parameters = @Parameter(name = "property", value = "structure"))
@Id
@GeneratedValue(generator = "generator")
private long structureId;
为什么要将
structureId
作为生成的主键

正确的方法是创建一个由您生成的
id
字段。还有一个单独的
structureId
字段,它将是指向
structure
表的FK。
structureId
字段通常只存在于DB中,而不是作为address类的字段存在。它将仅用作关系注释中的键

我还建议使用
Long
对象而不是
Long
主数据类型作为键

主要原因是对象可以是
null
,这在使用JPA时非常有用,以便确定实体是否已被持久化或是新创建的。我猜一个long的值应该是零,你可以检查一下,但这似乎不太安全

另外,如果您希望将java集合与ID一起使用,则更容易。例如,不能将
long
用作
Map
键,但可以使用
long
对象

最后,关于带日期的子对象,这可能需要不同的表和类结构

首先,关系将变成多对一(多面是
地址
),地址(和其他)对象将有一个
字段,或者更好的是一个
开始日期
结束日期
字段(这样,如果地址没有更改,就不会重复)。或者您可以有第三个表
year
,地址将指向它以及结构。这完全取决于您的要求。

更新:) 这是架构的一部分

年度结构:

@Entity
public class AnnualStructure {

@Id
@GeneratedValue
private Long annualStructureId;

private Long structureId;

@ManyToOne
@JoinColumn(name = "year_id")
private FinancialYear yearInformations;

@OneToOne(fetch = FetchType.LAZY, mappedBy = "annualStructure", cascade = CascadeType.ALL)
private StructureInfos structureInfos;
}
结构信息:

@Entity
public class StructureInfos {

@GenericGenerator(name = "generator", strategy = "foreign", parameters = @Parameter(name = "property", value = "annualStructure"))
@Id
@GeneratedValue(generator = "generator")
private Long annualStructureId;

@OneToOne(optional = false, fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn
@JsonIgnore
private AnnualStructure annualStructure;    

@OneToOne(fetch = FetchType.LAZY, mappedBy = "structureInfos", cascade = CascadeType.ALL)
private Coordonnees coordonnees;

@OneToOne(fetch = FetchType.LAZY, mappedBy = "structureInfos", cascade = CascadeType.ALL)
private StructureJuridique infosJuridique;
}
合作伙伴:

@Entity
public class Coordonnees {

@GenericGenerator(name = "generator", strategy = "foreign", parameters = @Parameter(name = "property", value = "structureInfos"))
@Id
@GeneratedValue(generator = "generator")
private Long annualStructureId;

@OneToOne(optional = false, fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn
@JsonIgnore
private StructureInfos structureInfos;

private String street;
private String city;
}
我希望能够使用年度结构id轻松访问每个信息(例如Coordonnes),而不必获取整个对象年度结构。
你觉得怎么样?

为什么要用restful架构来标记你的问题?似乎没什么关系…我已经换了标签。谢谢你的回答和建议。关于生成的主键,我遵循了本教程。structureId与我认为的结构对象的id相同。关于延迟加载,我不确定是否理解,因为当我在hibernate日志中获得地址时,我有两个select请求:一个用于地址,另一个用于相关结构。如果我在地址对象中的“fetch=FetchType.LAZY”旁边加上“optional=false”,那么只有地址请求,我认为这样更好,因为我在获取地址时不需要结构。关于主键:我想在两个实体中使用相同的键是可能的。但是它必须只在父端(结构)生成,并且在创建它时必须在子实体(地址)上手动设置它。我有一个问题。我想在AnnualStructure对象中设置唯一的对structureId/YearInformation。可能吗?