Java JPA实体关系是否相互影响?

Java JPA实体关系是否相互影响?,java,hibernate,jpa,Java,Hibernate,Jpa,我一直想知道JPA实体关系是否是互惠的。让我们以@OneToOneJava7教程为例:“一对一:每个实体实例都与另一个实体的单个实例相关” 这是否意味着其他实体的每个实例都与该实体的一个实例相关?我不清楚 但Microsoft在中说:“在一对一关系中,表a中的一行不能有多个匹配行,反之亦然。如果两个相关列都是主键或具有唯一约束,则会创建一对一关系。”非常清楚,但这是否适用于JPA(标准)/Hibernate(impl)?或者是每个公司都赋予了他们想要的关系的含义 @Entity public c

我一直想知道JPA实体关系是否是互惠的。让我们以
@OneToOne
Java7教程为例:“一对一:每个实体实例都与另一个实体的单个实例相关”

这是否意味着其他实体的每个实例都与该实体的一个实例相关?我不清楚

但Microsoft在中说:“在一对一关系中,表a中的一行不能有多个匹配行,反之亦然。如果两个相关列都是主键或具有唯一约束,则会创建一对一关系。”非常清楚,但这是否适用于JPA(标准)/Hibernate(impl)?或者是每个公司都赋予了他们想要的关系的含义

@Entity
public class ParentEntity {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

private String parent;

@OneToOne(cascade = CascadeType.ALL)
private ChildEntity childEntity;
和子实体(注:单向关系):

如果测试通过,请注意,两个父实体都与相同的子实体相关:

    @Test
public void canCreateAndRetrieve() throws NotSupportedException, SystemException, DaoException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException {
    //given        
    ParentEntity pe1 = new ParentEntity();
    pe1.setParent("Parent1");

    ParentEntity pe2 = new ParentEntity();
    pe2.setParent("parent2");

    ChildEntity childEntity1 = new ChildEntity();
    childEntity1.setChild("Child1");

    pe1.setChildEntity(childEntity1);
    pe2.setChildEntity(childEntity1);

    utx.begin();
    try {
        //when
        parentDao.create(pe1);
        parentDao.create(pe2);
    } finally {
        utx.commit();
    }
    utx.begin();
    try {
        List<ParentEntity> results = parentDao.getAll();
        //then
        Assert.assertEquals(2, results.size());
        ParentEntity dbParentEntity1 = results.get(0);
        ParentEntity dbParentEntity2 = results.get(1);

        assertEquals(dbParentEntity1.getChildEntity().getChild(), dbParentEntity2.getChildEntity().getChild());
    } finally {
        utx.rollback();
    }
}

这是否意味着在Hibernate中,除非关系是双向的,否则它们不会相互作用?Hibernate允许你拥有某种混合/部分关系=>单向关系?你们有我能读到的文档吗?

“互惠”没有任何意义-你实际上是指“双向”和:是的,JPA关系默认是单向的,你可以将任何东西映射到任何东西,而无需定义关系的另一面,这使开发人员能够创建许多灵活的数据模型——这是一个非常有用的特性。如果您指定了关系的两侧,则它将隐式成为具有自动同步甚至级联的双向关系(如果您指定了级联选项)。是的,OneToOne表示a有0或1个B,B有0或1个a。否则,它将是多个one。@Specializet English不是我的母语,将“reciprocate”改为“reciprocated”,显然我指的是形容词而不是动词,我的抱歉。我所说的回报是微软上面定义的“反之亦然”。我不是指“导航访问”中的双向。如果这是你的意思,你错了。@jbnize两个不同的As可以在一对一的关系中指向同一个B吗?我原以为不行,但话说回来,我的测试通过了。我不想说有很多(或两种)不同的
OneToOne
。数据库应该反映您的模型,如果某个对象在逻辑上是
OneToOne
,那么它也应该像在数据库中一样实现(具有唯一约束),不管它是单向的还是双向的。因为,在项目中间遇到一个要求来暴露关系的另一方,从UNI转换为双向,这并不少见。如果你不从一开始就按照逻辑来对待它,你就会失败。
    @Test
public void canCreateAndRetrieve() throws NotSupportedException, SystemException, DaoException, SecurityException, IllegalStateException, RollbackException, HeuristicMixedException, HeuristicRollbackException {
    //given        
    ParentEntity pe1 = new ParentEntity();
    pe1.setParent("Parent1");

    ParentEntity pe2 = new ParentEntity();
    pe2.setParent("parent2");

    ChildEntity childEntity1 = new ChildEntity();
    childEntity1.setChild("Child1");

    pe1.setChildEntity(childEntity1);
    pe2.setChildEntity(childEntity1);

    utx.begin();
    try {
        //when
        parentDao.create(pe1);
        parentDao.create(pe2);
    } finally {
        utx.commit();
    }
    utx.begin();
    try {
        List<ParentEntity> results = parentDao.getAll();
        //then
        Assert.assertEquals(2, results.size());
        ParentEntity dbParentEntity1 = results.get(0);
        ParentEntity dbParentEntity2 = results.get(1);

        assertEquals(dbParentEntity1.getChildEntity().getChild(), dbParentEntity2.getChildEntity().getChild());
    } finally {
        utx.rollback();
    }
}
@Entity
public class ChildEntity {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

private String child;

@OneToOne(cascade = CascadeType.ALL, mappedBy = "childEntity")
private ParentEntity parentEntity;