当前位置: 首页 > 面试题库 >

具有共享主键的两个表之间的OneToOne

张晨朗
2023-03-14
问题内容

我正在尝试使用JPA / Hibernate设置以下表:

User:

userid - PK
name

Validation:

userid - PK, FK(user)
code

可能有很多用户,每个用户最多只能有一个验证码,也可能没有。

这是我的课程:

public class User 
{
    @Id
    @Column(name = "userid") 
    @GeneratedValue(strategy = GenerationType.IDENTITY)    
    protected Long userId;

    @Column(name = "name", length = 50, unique = true, nullable = false)
    protected String name;

    ...
}

public class Validation 
{
    @Id
    @Column(name = "userid")
    protected Long userId;

    @OneToOne(cascade = CascadeType.ALL)
    @PrimaryKeyJoinColumn(name = "userid", referencedColumnName = "userid")
    protected User user;

    @Column(name = "code", length = 10, unique = true, nullable = false)
    protected String code;

    ...

    public void setUser(User user)
    {
        this.user = user;
        this.userId = user.getUserId();
    }

    ...
}

我创建一个用户,然后尝试使用以下代码添加验证代码

public void addValidationCode(Long userId)
{   
    EntityManager em = createEntityManager();
    EntityTransaction tx = em.getTransaction();

    try 
    {
        tx.begin();

        // Fetch the user
        User user = retrieveUserByID(userId);

        Validation validation = new Validation();
        validation.setUser(user);
        em.persist(validation);
        tx.commit();
    }
    ...
}

当我尝试运行它时,我收到org.hibernate.PersistentObjectException:分离的实体传递给持久化:用户

我还尝试在Validation类中使用以下代码:

public void setUserId(Long userId)
{
    this.userId = userId;
}

当我创建验证码时,我只是做:

Validation validation = new Validation();
validation.setUserId(userId);
em.persist(validation);
tx.commit();

但是,由于User为null,因此我得到org.hibernate.PropertyValueException:not-
null属性引用了null或瞬态值:User.code

感谢您提供有关如何最好地解决此问题的帮助!


问题答案:

如果您使用hibernate模式,也可以使用

public class Validation {

    private Long validationId;
    private User user;

    @Id
    @GeneratedValue(generator="SharedPrimaryKeyGenerator")
    @GenericGenerator(name="SharedPrimaryKeyGenerator",strategy="foreign",parameters =  @Parameter(name="property", value="user"))
    @Column(name = "VALIDATION_ID", unique = true, nullable = false)
    public Long getValidationId(){
        return validationId;
    }

    @OneToOne
    @PrimaryKeyJoinColumn
    public User getUser() {
        return user;
    }

}

Hibernate将确保Validation的ID与User实体集的ID相同。



 类似资料:
  • 在Java中,对于两个JVM(运行在同一台物理机器上),是否有办法使用/共享相同的内存地址空间?假设JVM-1中的生产者将消息放在特定的预定义内存位置,如果JVM-2上的消费者知道要查看哪个内存位置,那么它是否可以检索消息?

  • 我正在试图弄清楚如何在Helm中的两个图表之间共享数据。 在两个图表之间共享configmap的最佳实践是什么?

  • 我在读下面的文章: 然而,student实体是用mappedBy注释的,我知道任何用mappedBy注释的实体都是相反的一面。谁能解释一下这个吗? 2-哪个ID是外键?@PrimaryKeyJoinColumn在Address实体中使用,这意味着地址Id是主键和外键吗?在下面的文章中,它们有相同的示例,但它是单向的: http://websystique.com/hibernate/hiberna

  • 问题内容: 我需要在两个(或更多个)组合框之间共享数据,但是我想独立选择元素。例如,如果我在第一个comboBox中选择Object1,则我的第二个ComboBox也选择Object1,因为它们具有相同的模型(DefaultComboBoxModel,并且此模型还管理所选的对象)。但是我不想要这种行为。我想在我的comboBoxes中独立选择对象。当我在第一个comboBox中选择对象时,我的第二

  • 我有一个包含两个片段的FragmentActivity(support-v4)。并且都包含一个带有ActionBar的SearchView的菜单。 PlayListFragment: 附注。 我找到了原因,但没有解决方法: 呼叫 如何禁用ActionBar/SearchView/TextView的保存和还原?