当前位置: 首页 > 知识库问答 >
问题:

用懒惰的行为在PK之间冬眠一个

施自明
2023-03-14
MyEntityImpl entity = em.find(MyEntityImpl.class, 1L);

我正在使用@OneToOne映射关系。我尝试了FetchTypeOptional@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;

共有1个答案

充昌勋
2023-03-14

在遵循@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