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

JPA ORM与OneToOne映射的混淆

上官羽
2023-03-14

我读过一个映射是“关系在Java中是指源对象有一个引用另一个目标对象的属性,并且(如果)目标对象与源对象有反向关系,它也将是一个一个关系。”来源:http://en.wikibooks.org/wiki/java_persistence/OneToOne

基于以上,我假设一个表可以引用基数为(零)1的另一个表,而这个表可以反向引用基数为(零)1的第一个表。

所以,我创建了这个简单的实体(Cust可以有一个Adress,Adress可以有一个Cust)

@Entity
public class Cust {

 @Id 
 @GeneratedValue
 private Long id;

 private String desc;

 @OneToOne(fetch = FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.REMOVE})
 @JoinColumn(name="adress_fk")
 private Adress adress;

 //getters, setters...


@Entity
public class Adress {

  @Id
  @GeneratedValue
  private Long id;

  private String val1;
  private String val2;

  @OneToOne(mappedBy = "adress")
  private Cust b;

  //getters, setters...

我很好奇,当我尝试用同样的地址坚持两个cust时,会发生什么。我编写了示例代码来试一试:

    Adress thisSameAddress = new Adress();
    thisSameAddress.setVal1("blabla");
    thisSameAddress.setVal2("nlanla");

    Cust b = new Cust();
    b.setAdress(thisSameAddress );
    b.setDesc("asdasd");

    Cust c = new Cust();
    c.setAdress(thisSameAddress );
    c.setDesc("eeee");

        tx.begin();
        em.persist(b);
        em.persist(c);
        tx.commit();

在尝试使用相同地址持久化两个custs时,我预期会出现一些异常。但是,代码运行了,在数据库中我可以看到一个Adress和两个Custs:

SELECT * FROM CUST;
ID      DESC    ADRESS_FK  
1       asdasd  1
2       eeee    1

SELECT * FROM ADRESS;
ID      VAL1    VAL2  
1       a       c

为什么JPA允许这种操作?这就像是多(客户)对一(地址)的关系。

JPA实现是4.3.6 Final,DB是H2 1.4.181

共有1个答案

许兴文
2023-03-14

可能重复http://stackoverflow.com/questions/8968294/why-onetoOne-is-allower-duplicate-associations看起来@onetoOne不强制唯一约束

 类似资料:
  • 问题内容: 假设我有个人 和工作 提取时,我无法将Person和Job映射到其他实体。 我在做什么错? 问题答案: 您的代码应为: (尝试从工作中删除重复的列’person_id’) 或其他共享主键的方法:

  • 问题内容: 我正在尝试使Hibernate @OneToOne注释正常工作,并且在这里没有太大的成功… 假设我有一个名为的表格,看起来像这样: 我有一个看起来像这样的实体: 还有一个类似的,另一个实体看起来像这样: 当我进行读取时,我希望它将返回带有的对象。相反,我得到一个AnnotationException:“引用的属性不是(One | Many)ToOne:mappedBy User.sta

  • 我有2个实体:Field和ViewOptions 省略与问题无关的字段和方法

  • 我一直试图通过一个名为Guardian的中间类映射两个用户之间的一些“OneToOne”关系。当我试图检索一个用户(和他的监护人)时,从Glassfish(Open edition V4.0)返回一个内部服务器错误。但是,日志中没有显示任何类型的堆栈跟踪或任何错误。我怀疑问题是我在JPA类中的映射。 启动服务器时,我得到两个与Guardian类有关的警告,但我并不真正理解: 警告:映射到元素[me

  • 我不熟悉Spring数据jpa,并试图理解@OneToOne映射。假设我有一个员工实体和一个公司实体,如果我想映射这两个实体,那么我可以在员工实体上使用一对一映射,这意味着一个员工只能属于一个公司。这种理解是错误的吗?如果一名员工属于一家公司(比如XYZ),那么该公司(XYZ)不能映射到其他员工? 我读过一些帖子,但没有完全理解。

  • 我在使用模型映射器使用执行父子实体更新时遇到了一个问题。 描述如下 父类: 儿童班: 通过这种安排,我能够成功地创建和查询站点地址组合。但是,我在进行更新时遇到了一个问题。我正在尝试使用modelmapper语句更新站点或地址,如下所示: 期望在传入站点中更改的所有字段(即来自请求的站点)应替换站点中的现有字段。但是,我从modelmapper中得到一个Stackoverflow错误。 我们是否有