MyEntityImpl entity = em.find(MyEntityImpl.class, 1L);
我正在使用@OneToOne
映射关系。我尝试了FetchType
、Optional
和@LazyToOne
的几种组合,但到目前为止没有成功。
下面是MyEntity和MyEntityInfo类的代码(删除了额外的getter和setter):
MyEntity(ID生成器是自定义序列生成器):
@Entity
@Table(name = MyEntityImpl.TABLE_NAME)
public class MyEntityImpl {
public static final String TABLE_NAME = "TMP_MY_ENTITY";
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "GEN_" +
TABLE_NAME)
@GenericGenerator(name = "GEN_" +
TABLE_NAME, strategy = CoreIdGenerator.ID_GENERATOR, parameters = {
@Parameter(name = "tableName", value = TABLE_NAME) })
@Column(name = "sid", nullable = false, unique = true)
private Long sid;
@OneToOne(mappedBy = "myEntity", cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = true)
@LazyToOne(LazyToOneOption.NO_PROXY)
private MyEntityInfoImpl info;
@Column
private String field;
@Entity
@Table(name = MyEntityInfoImpl.TABLE_NAME)
public class MyEntityInfoImpl {
public static final String TABLE_NAME = "TMP_MY_ENTITY_INFO";
@Id
@Column(name = "SID", nullable = false, unique = true)
private Long sid;
@OneToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "SID", referencedColumnName = "SID", insertable = false, updatable = false, nullable = false)
private MyEntityImpl myEntity;
@Column(name = "INFO_FIELD")
private String infoField;
我已经设法使用@OneTomany
和手动管理数据来做一些类似的事情,但这不是我想做的。但是,也欢迎使用@OneToOne
或正确的设计模式来实现这一点的其他替代方案和信息。
PS:为SQL Server创建数据库表,如果您想尝试:
create table TMP_MY_ENTITY (SID NUMERIC(19,0) NOT NULL, FIELD VARCHAR(100));
go
ALTER TABLE TMP_MY_ENTITY ADD CONSTRAINT PK_TMP_MY_ENTITY PRIMARY KEY CLUSTERED (SID);
go
create table TMP_MY_ENTITY_INFO (SID NUMERIC(19,0) NOT NULL, INFO_FIELD VARCHAR(100));
go
ALTER TABLE TMP_MY_ENTITY_INFO ADD CONSTRAINT PK_TMP_MY_ENTITY_INFO PRIMARY KEY CLUSTERED (SID);
go
CREATE SEQUENCE SEQ_TMP_MY_ENTITY START WITH 1 INCREMENT BY 1 MINVALUE 1 CACHE 20;
alter table TMP_MY_ENTITY_INFO add constraint FK_TMP_MY_ENT_INFO_MY_ENT FOREIGN KEY (SID) references TMP_MY_ENTITY(SID);
go
insert into TMP_MY_ENTITY(SID, FIELD) VALUES (NEXT VALUE FOR SEQ_TMP_MY_ENTITY, 'Field 1');
insert into TMP_MY_ENTITY_INFO(SID, INFO_FIELD) VALUES ((SELECT MAX(SID) FROM TMP_MY_ENTITY), 'Info 1');
insert into TMP_MY_ENTITY(SID, FIELD) VALUES (NEXT VALUE FOR SEQ_TMP_MY_ENTITY, 'Field 2');
insert into TMP_MY_ENTITY_INFO(SID, INFO_FIELD) VALUES ((SELECT MAX(SID) FROM TMP_MY_ENTITY), 'Info 2');
insert into TMP_MY_ENTITY(SID, FIELD) VALUES (NEXT VALUE FOR SEQ_TMP_MY_ENTITY, 'Field 3 no info');
-- DELETE ALL
drop table TMP_MY_ENTITY_INFO;
drop table TMP_MY_ENTITY;
drop sequence SEQ_TMP_MY_ENTITY;
在遵循@sternk链接,并升级到Wildfly 19和Hibernate 5.4.14之后,通过使用@mapsid
,它终于起作用了。
要使用的正确映射是:
我的实体:
public class MyEntityImpl {
@OneToOne(mappedBy = "myEntity", cascade = CascadeType.REMOVE, fetch = FetchType.LAZY, optional = true)
@JoinColumn(name = "SID")
private MyEntityInfoImpl info;
public class MyEntityInfoImpl {
@OneToOne(fetch = FetchType.EAGER, optional = false)
@MapsId
@JoinColumn(name = "SID", referencedColumnName = "SID", insertable = false, updatable = false, nullable = false)
private MyEntityImpl myEntity;
问题内容: 我想要3个Java类的对象之间的 单向 一对一关系:“人到心脏”和“人到肝脏”。我希望对象共享相同的PK,即每个人都有相应的心脏和肝脏,其中person.person_id = heart.heart_id = liver.liver_id。我不想将3个表合并为1个表,因为每个表都有很多字段。这是我的代码(主要基于该问题的公认答案): 我设置了会话并执行以下操作: 然后,如果我将人对象
另一种方法是使用Crieteria关联,但关联只能与和一起工作! 请在这里帮帮我。
我目前使用的是spring boot starter数据jpa:2.7.0,它使用的是hibernate:5.6.9。 我在链接多个实体时有一种奇怪的行为。 我得到了三个实体,其中E1包含E2的一个多域列表,E2也包含E3的一个多域列表: 对于每个实体,我定义了简单的存储库,例如: 此外,我根据存储库类来访问日期。存储很好,工作正常。 当存储一个和一个的列表时,具有两个的列表会导致我的数据库表中的
我正在Spring和Hibernate上编写一个测试服务器。 在执行代码期间,我收到了一个 LazyInitializationException。 我发现了两个糟糕的解决方案:“视图中的开放会话”和“hibernate.enable_lazy_load_no_trans”。我没有使用它们。 我找到了一个可行的解决方案,但正如其他人所写,它也不是很好。在实体上方,我放置了一个注释@Proxy(la
配置类的应用程序侦听器时出现错误 这实际上是我的错误 ** 严重:配置类org的应用程序侦听器时出错。springframework。网状物上下文ContextLoaderListener java。lang.NoClassDefFoundError:javax/servlet/ServletContextListener **在爪哇。lang.ClassLoader。java上的findBoot
问题内容: 他们幸福地结婚了吗? 我正在使用最新版本的hibernate(4)和1.3版的joda-time hibernate支持,我也相信这是当前的最新版本。 使用注释时,一切似乎都正常(按预期方式创建了日期列): 一起使用这些版本是否存在任何已知问题? Update Well证明已创建列,但无法填充任何数据: 处理程序处理失败; 嵌套异常是java.lang.AbstractMethodEr