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